→题目链接←
【想说的话】
rope大法好*2
【题解】
和我的上一篇没有什么区别
需要注意的是 xor 和 MLE 问题
MLE的解决办法是路径压缩时如果可以不更新就不更新
我第一次知道这种东西可以这么缩内存....
【代码】
#include<bits/stdc++.h>
#include<ext/rope>
#define MAXN 200020
using namespace std;
using namespace __gnu_cxx;
inline int rd(){
int x=0,y=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*y;
}
int n,m;
rope<int> *rp[MAXN];
int a[MAXN];
inline int fa(int i,int x){
return rp[i]->at(x);
}
int getroot(int i,int x){
if(fa(i,x)==x)return x;
int f=getroot(i,fa(i,x));
if(fa(i,x)!=f)rp[i]->replace(x,f);
return f;
}
inline void un(int i,int x,int y){
x=getroot(i,x);
y=getroot(i,y);
if(x==y)return;
rp[i]->replace(x,y);
}
int main(){
n=rd(),m=rd();
for(int i=1; i<=n; i++)a[i]=i;
rp[0]=new rope<int>(a,a+n+1);
int i=0,lastans=0;
while(m--){
i++;
rp[i]=new rope<int>(*rp[i-1]);
int x=rd(),y,z;
if(x==1)y=rd()^lastans,z=rd()^lastans,un(i,y,z);
else if(x==2)y=rd()^lastans,rp[i]=new rope<int>(*rp[y]);
else y=rd()^lastans,z=rd()^lastans,printf("%d\n",lastans=getroot(i,y)==getroot(i,z)?1:0);
}
return 0;
}