[BZOJ2827]千山鸟飞绝

  1 #include <cmath>
  2 #include <ctime>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <iostream>
  7 #include <algorithm>
  8 # define maxn 30010
  9 using namespace std;
 10 void ot(int x){cout<<"***** ->"<<x<<endl;}
 11 int n,m;
 12 int bd[maxn];
 13 int ans1[maxn],ans2[maxn];   //ans2==num
 14 struct ROU{
 15     int val,id;
 16 };
 17 bool operator < (const ROU a,const ROU b){
 18     if(a.val==b.val) return a.id<b.id;
 19     return a.val<b.val;
 20 }
 21 struct Treap{
 22     Treap* ch[2];
 23     ROU tt;
 24     int size,key,mk1,mk2;
 25     Treap(int v,int ii)
 26         {size=1; tt.val=v; tt.id=ii; key=rand(); mk1=mk2=0; ch[0]=ch[1]=NULL;}
 27     void update()
 28         {size=1+(ch[0]?ch[0]->size:0)+(ch[1]?ch[1]->size:0);}
 29 };
 30 typedef pair<Treap*,Treap*> D;
 31 int Size(Treap* now){return now? now->size:0;}
 32 int mmxx(Treap *now){return now? now->tt.val:0;}
 33 void pushdown(Treap* &now){
 34     if(!now) return;
 35     if(now->ch[0]){
 36         now->ch[0]->mk1=max(now->mk1,now->ch[0]->mk1);
 37         now->ch[0]->mk2=max(now->mk2,now->ch[0]->mk2);
 38     }
 39     if(now->ch[1]){
 40         now->ch[1]->mk1=max(now->mk1,now->ch[1]->mk1);
 41         now->ch[1]->mk2=max(now->mk2,now->ch[1]->mk2);
 42     }
 43     int ii=now->tt.id;
 44     ans1[ii]=max(ans1[ii],now->mk1);
 45     ans2[ii]=max(ans2[ii],now->mk2);
 46     now->mk1=0; now->mk2=0;
 47 }
 48 D Split(Treap* now,int k){
 49     if(!now) return D(NULL,NULL);
 50     D y;
 51     pushdown(now);
 52     if(Size(now->ch[0])>=k)
 53         {y=Split(now->ch[0],k); now->ch[0]=y.second; now->update(); y.second=now;}
 54     else
 55         {y=Split(now->ch[1],k-Size(now->ch[0])-1); now->ch[1]=y.first; now->update(); y.first=now;}
 56     return y;
 57 }
 58 Treap* Merge(Treap* a,Treap* b){
 59     if(!a) return b;
 60     if(!b) return a;
 61     if(a->key < b->key)
 62         {a->ch[1]=Merge(a->ch[1],b); a->update(); return a;}
 63     else
 64         {b->ch[0]=Merge(a,b->ch[0]); b->update(); return b;}
 65 }
 66 int Getkth(Treap* now,ROU o){
 67     if(!now) return 0;
 68     return (!(now->tt<o))? Getkth(now->ch[0],o):Getkth(now->ch[1],o)+Size(now->ch[0])+1;
 69 }
 70 int Findkth(Treap* &rt,int k){
 71     D x=Split(rt,k-1);
 72     D y=Split(x.second,1);
 73     Treap* ans=y.first;
 74     rt=Merge(Merge(x.first,ans),y.second);
 75     return ans? ans->tt.val:0;
 76 }
 77 void add_mk(ROU o,Treap* &now){
 78     if(!now) return ;
 79     int da=Findkth(now,now->size);
 80     now->mk1=max(now->mk1,o.val);
 81     now->mk2=max(now->mk2,now->size);
 82     ans1[o.id]=max(ans1[o.id],da);
 83     ans2[o.id]=max(ans2[o.id],now->size);
 84 }
 85 void Insert(ROU o,Treap* &rt){
 86     add_mk(o,rt);
 87     int k=Getkth(rt,o);
 88     D x=Split(rt,k);
 89     Treap* now=new Treap(o.val,o.id);
 90     rt=Merge(Merge(x.first,now),x.second);
 91 }
 92 void Delete(ROU o,Treap* &rt){
 93     int k=Getkth(rt,o);
 94     D x=Split(rt,k); 
 95     D y=Split(x.second,1);
 96     int ii=y.first->tt.id;
 97     ans1[ii]=max(ans1[ii],y.first->mk1);
 98     ans2[ii]=max(ans2[ii],y.first->mk2);
 99     rt=Merge(x.first,y.second);
100 }
101 struct HHs{
102     struct node{
103         int x,y,nxt;
104         Treap* rt;
105     }g[4000000];
106     int e,adj[80000];
107     int modx;
108     int mody;
109     int mod;
110     HHs(){
111         memset(adj,-1,sizeof(adj));
112         modx=7307; mody=9991; mod=76543;
113     }
114     void add(int now,int x,int y){
115         g[e].x=x; g[e].y=y; g[e].nxt=adj[now];
116         adj[now]=e++;
117     }
118     int find(int x,int y){
119         int now=(((x%modx)+modx)%modx)*(((y%mody)+mody)%mody)%mod;
120         for(int i=adj[now];i!=-1;i=g[i].nxt){
121             if(x==g[i].x && y==g[i].y){
122                 return i;
123             }
124         }
125         add(now,x,y); return e-1;
126     }
127 }hs;
128 int pos[maxn][3];
129 void init(){
130     scanf("%d",&n);
131     int now; ROU o;
132     for(int i=1;i<=n;i++){
133         scanf("%d%d%d",&bd[i],&pos[i][0],&pos[i][1]);
134         now=hs.find(pos[i][0],pos[i][1]);
135         o.id=i; o.val=bd[i];
136         Insert(o,hs.g[now].rt);
137     }
138 }
139 void work(){
140     scanf("%d",&m);
141     int iid,x,y;
142     int now; ROU o;
143     for(int i=1;i<=m;i++){
144         scanf("%d%d%d",&iid,&x,&y);
145         o.id=iid; o.val=bd[iid];
146         now=hs.find(pos[iid][0],pos[iid][1]);
147         Delete(o,hs.g[now].rt);
148         pos[iid][0]=x; pos[iid][1]=y; 
149         now=hs.find(x,y);
150         Insert(o,hs.g[now].rt);
151     }
152     for(int i=1;i<=n;i++){
153         now=hs.find(pos[i][0],pos[i][1]);
154         o.id=i; o.val=bd[i];
155         Delete(o,hs.g[now].rt);
156     }
157     long long ans;
158     for(int i=1;i<=n;i++){
159         ans=(long long)ans1[i]*ans2[i];
160         printf("%lld\n",ans);
161     }
162 }
163 int main(){
164     // freopen("a.in","r",stdin);
165     init();
166     work();
167 }

 

posted @ 2017-09-24 19:26  Nawox  阅读(168)  评论(0编辑  收藏  举报