杜教的AAA树

膜膜膜,常数挺小的。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstring>
  7 #define PAU putchar(' ')
  8 #define ENT putchar('\n')
  9 #define rep(i,a,n) for(int i=a;i<n;i++)
 10 using namespace std;
 11 const int maxn=1e5+1000,inf=-1u>>1;
 12 int getint(){
 13     int res=0,f=1;char c=getchar();
 14     while(!isdigit(c))f=f==-1||c=='-'?-1:1,c=getchar();
 15     while(isdigit(c))res=res*10+c-'0',c=getchar();
 16     return res*f;
 17 }
 18 int n,m;
 19 struct info{
 20     int mx,mn,sum,siz;
 21     info(){}
 22     info(int mx,int mn,int sum,int siz):
 23         mx(mx),mn(mn),sum(sum),siz(siz){}
 24 };
 25 struct flag{
 26     int mul,add;
 27     flag(){mul=1;}
 28     flag(int mul,int add):
 29         mul(mul),add(add){}
 30     bool empty(){return mul==1&&add==0;}
 31 };
 32 info operator+(const info &a,const flag &b) {
 33     return a.siz?info(a.mx*b.mul+b.add,a.mn*b.mul+b.add,a.sum*b.mul+b.add*a.siz,a.siz):a;
 34 }
 35 info operator+(const info &a,const info &b) {
 36     return info(max(a.mx,b.mx),min(a.mn,b.mn),a.sum+b.sum,a.siz+b.siz);
 37 }
 38 flag operator+(const flag &a,const flag &b) {
 39     return flag(a.mul*b.mul,a.add*b.mul+b.add);
 40 }
 41 struct node{
 42     node *ch[4],*f;
 43     flag Cha,All;
 44     info cha,sub,all;
 45     bool rev,inr;
 46     int val;
 47     void revt(){rev^=1;swap(ch[0],ch[1]);}
 48     void makec(const flag &a){
 49         Cha=Cha+a;cha=cha+a;val=val*a.mul+a.add;
 50         all=cha+sub;
 51     }
 52     void makes(const flag &a,bool _=1){
 53         All=All+a;all=all+a;sub=sub+a;
 54         if(_)makec(a);
 55     }
 56     void update(){
 57         cha=all=sub=info(-inf,inf,0,0);
 58         if(!inr)all=cha=info(val,val,val,1);
 59         rep(i,0,2)if(ch[i])cha=cha+ch[i]->cha,sub=sub+ch[i]->sub;
 60         rep(i,0,4)if(ch[i])all=all+ch[i]->all;
 61         rep(i,2,4)if(ch[i])sub=sub+ch[i]->all;
 62     }
 63     void down(){
 64         if(rev){
 65             if(ch[0])ch[0]->revt();
 66             if(ch[1])ch[1]->revt();
 67             rev=0;
 68         }
 69         if(!All.empty()){
 70             rep(i,0,4)if(ch[i])ch[i]->makes(All,i>=2);
 71             All=flag(1,0);
 72         }
 73         if(!Cha.empty()){
 74             rep(i,0,2)if(ch[i])ch[i]->makec(Cha);
 75             Cha=flag(1,0);
 76         }
 77     }
 78     node *C(int i){if(ch[i])ch[i]->down();return ch[i];}
 79     bool d(int ty){return f->ch[ty+1]==this;}
 80     int D(){rep(i,0,4)if(f->ch[i]==this)return i;}
 81     void sets(node *x,int d){if(x)x->f=this;ch[d]=x;}
 82     bool rt(int ty){
 83         if(ty==0)return !f||(f->ch[0]!=this&&f->ch[1]!=this);
 84         else return !f||!f->inr||!inr;
 85     }
 86 }nd[maxn*2],*cur=nd+maxn,*pool[maxn],**Cur=pool;
 87 int _cnt;
 88 node *newnode(){
 89     _cnt++;
 90     node *x=(Cur==pool)?cur++:*(--Cur);
 91     rep(i,0,4)x->ch[i]=0;x->f=0;
 92     x->All=x->Cha=flag(1,0);
 93     x->all=x->cha=info(-inf,inf,0,0);
 94     x->inr=1;x->rev=0;x->val=0;
 95     return x;   
 96 }
 97 void dele(node *x){*(Cur++)=x;}
 98 void rot(node *x,int ty){
 99     node *p=x->f;int d=x->d(ty);
100     if(!p->f)x->f=0;else p->f->sets(x,p->D());
101     p->sets(x->ch[!d+ty],d+ty);x->sets(p,!d+ty);p->update();
102 }
103 void splay(node *x,int ty=0){
104     while(!x->rt(ty)){
105         if(x->f->rt(ty))rot(x,ty);
106         else if(x->d(ty)==x->f->d(ty))rot(x->f,ty),rot(x,ty);
107         else rot(x,ty),rot(x,ty);
108     }x->update();
109 }
110 void add(node *u,node *w){
111     w->down();
112     rep(i,2,4)if(!w->ch[i]){w->sets(u,i);return;}
113     node *x=newnode(),*v;
114     for(v=w;v->ch[2]->inr;v=v->C(2));
115     x->sets(v->ch[2],2);x->sets(u,3);
116     v->sets(x,2);splay(x,2); 
117 }
118 void del(node *w){
119     if(w->f->inr){
120         w->f->f->sets(w->f->ch[5-w->D()],w->f->D());
121         dele(w->f);splay(w->f->f,2);
122     }else w->f->sets(0,w->D());
123     w->f=0;
124 }
125 void access(node *w){
126     static node *sta[maxn];
127     static int top=0;
128     node *v=w,*u;
129     for(u=w;u;u=u->f)sta[top++]=u;
130     while(top)sta[--top]->down();
131     splay(w);
132     if(w->ch[1])u=w->ch[1],w->ch[1]=0,add(u,w),w->update();
133     while(w->f){
134         for(u=w->f;u->inr;u=u->f);
135         splay(u);
136         if(u->ch[1])w->f->sets(u->ch[1],w->D()),splay(w->f,2);
137         else del(w);
138         u->sets(w,1);
139         (w=u)->update();
140     }splay(v);
141 }
142 void makert(node *x){
143     access(x);x->revt();
144 }
145 node *findp(node *u){
146     access(u);u=u->C(0);
147     while(u&&u->ch[1])u=u->C(1);
148     return u;
149 }
150 node *findr(node *u){for(;u->f;u=u->f);return u;}
151 node* cut(node *u){
152     node *v=findp(u);
153     if(v)access(v),del(u),v->update();
154     return v;
155 }
156 void link(node *u,node *v) {
157     node* p=cut(u);
158     if(findr(u)!=findr(v))p=v;
159     if(p)access(p),add(u,p),p->update();
160 }
161 int main(){
162     n=getint();m=getint();
163     static int _u[maxn],_v[maxn];
164     rep(i,1,n)_u[i]=getint(),_v[i]=getint();
165     rep(i,1,n+1){
166         nd[i].val=getint();
167         nd[i].update();
168     }
169     rep(i,1,n)makert(nd+_u[i]),link(nd+_u[i],nd+_v[i]);
170     int root=getint();
171     makert(nd+root);
172     int x,y,z;
173     node *u,*v;
174     while(m--){
175         int k=getint();x=getint();
176         u=nd+x;
177         if(k==0||k==3||k==4||k==5||k==11){
178             access(u);
179             if(k==3||k==4||k==11){
180                 int ans=u->val;
181                 rep(i,2,4)if(u->ch[i]){
182                     info res=u->ch[i]->all;                    
183                     if(k==3) ans=min(ans,res.mn);
184                     else if(k==4) ans=max(ans,res.mx);
185                     else if(k==11) ans+=res.sum;
186                 }printf("%d\n",ans);
187             }else{
188                 y=getint();
189                 flag fg(k==5,y);
190                 u->val=u->val*fg.mul+fg.add;
191                 rep(i,2,4)if(u->ch[i])u->ch[i]->makes(fg);
192                 u->update();
193             }           
194         }else if(k==2||k==6||k==7||k==8||k==10){
195             y=getint();
196             makert(u),access(nd+y),splay(u);
197             if (k==7||k==8||k==10) {
198                 info ans=u->cha;
199                 if (k==7) printf("%d\n",ans.mn);
200                 else if (k==8) printf("%d\n",ans.mx);
201                 else printf("%d\n",ans.sum);
202             }else u->makec(flag(k==6,getint())); 
203             makert(nd+root);
204         }else if(k==9)link(u,nd+getint());
205         else if(k==1)makert(u),root=x;  
206     }
207     return 0;
208 }

 

posted @ 2015-06-14 19:25  AI_Believer  阅读(666)  评论(0编辑  收藏  举报