LCT模板

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int fa[500010],ch[500010][2],sum[500010],v[500010],rev[500010],lb[500010],bf[500010][3],n,q,type,ty,last;
 4 bool root(int x){ return ((fa[x]==0)or((ch[fa[x]][0]!=x)and(ch[fa[x]][1]!=x))); }
 5 bool lch(int x){ return (ch[fa[x]][0]==x); }
 6 void up(int x){ sum[x]=sum[ch[x][0]]+v[x]+sum[ch[x][1]]; }
 7 void down(int x)
 8 {
 9     if(rev[x]==0)return;
10     rev[x]=0; swap(ch[x][0],ch[x][1]); if(ch[x][0])rev[ch[x][0]]^=1; if(ch[x][1])rev[ch[x][1]]^=1;
11 }
12 void rot(int x)
13 {
14     if((x==0)or(root(x)))return;
15     int y=fa[x]; int t=fa[y];
16     if(ch[t][0]==y)ch[t][0]=x;else if(ch[t][1]==y)ch[t][1]=x; fa[x]=t; fa[y]=x; 
17     if(ch[y][0]==x){ ch[y][0]=ch[x][1]; if(ch[x][1])fa[ch[x][1]]=y; ch[x][1]=y; }
18     else{ ch[y][1]=ch[x][0]; if(ch[x][0])fa[ch[x][0]]=y; ch[x][0]=y; }
19     up(y); up(x); if(t)up(t);
20 }
21 void splay(int x)
22 {
23     if(x==0)return; int xx=x; int cnt=0;
24     while(!root(xx)){ lb[++cnt]=xx; xx=fa[xx]; } lb[++cnt]=xx;
25     for(int i=cnt;i>=1;i--)down(lb[i]);
26     while(!root(x)){ if(!root(fa[x])){ if((lch(x))^(lch(fa[x])))rot(x);else rot(fa[x]); } rot(x); }
27 }
28 int access(int x)
29 {
30     int t=0;
31     while(x!=0){ splay(x); ch[x][1]=t; up(x); if(t)fa[t]=x; t=x; x=fa[x]; } 
32     return t;
33 }
34 void cut(int x,int y)
35 {
36     access(x); int z=access(y); splay(x);
37     if(x==z){ ch[x][1]=0; fa[y]=0; up(x); }else fa[x]=0;
38 }
39 void link(int x,int y)
40 {
41     access(x); splay(x); rev[x]^=1; fa[x]=y;
42 }
43 int qsum(int x,int y)
44 {
45     access(x); int z=access(y); splay(x);
46     if(x==z)return v[x]+sum[ch[x][1]];else return sum[x]+v[z]+sum[ch[z][1]]; 
47 }
View Code
posted @ 2017-03-16 14:26  GhoStreach  阅读(127)  评论(0编辑  收藏  举报