bzoj3674同上(好短)
+强在 就过了
既没有启发式又没有路径压缩,连建树都用的是代码最短的写法(什么心态,每天追求代码短)
话说回来 可持久化的数组感觉只能出类似裸题的题目,,,,藏也藏不住啊
1 #include <cstdio> 2 #define mid ((l+r)>>1) 3 int n,m,time,N=0,ca,x,y; 4 int root[500000],ls[8000000],rs[8000000],a[8000000]; 5 int change(int x,int y) 6 { 7 int l=1,r=n,now=++N,past=root[time]; 8 root[++time]=N; 9 while(l!=r) 10 if(x<=mid) rs[now]=rs[past],ls[now]=++N,r=mid,now=ls[now],past=ls[past]; 11 else ls[now]=ls[past],rs[now]=++N,l=mid+1,now=rs[now],past=rs[past]; 12 a[now]=y; 13 } 14 int que(int x) 15 { 16 int l=1,r=n,now=root[time]; 17 while(l!=r) 18 if(x<=mid) r=mid,now=ls[now]; 19 else l=mid+1,now=rs[now]; 20 return a[now]; 21 } 22 int get(int p) 23 { 24 for(int t=que(p);t!=p;t=que(p)) p=t; 25 return p; 26 } 27 int main() 28 { 29 scanf("%d%d",&n,&m); 30 root[time=0]=1; 31 for(int i=1;i<=n;i++) 32 change(i,i); 33 int start=time,lastans=0; 34 for(int i=1;i<=m;i++) 35 { 36 scanf("%d%d",&ca,&x);x^=lastans; 37 if(ca==2) root[++time]=root[x+start]; 38 else 39 scanf("%d",&y),y^=lastans,(ca==1)?change(get(y),get(x)):(root[time+1]=root[time++],printf("%d\n",get(x)==get(y))); 40 } 41 return 0; 42 }