显示代码纯文本
#define MAXN 600010UL
#include <cstdio>
int n,m,Ans;
struct ChairManTree{
int ls[MAXN*6],rs[MAXN*6],val[MAXN*6],cnt,root[MAXN];
inline void Build(int &rt,int l,int r){
rt=++cnt;
if(l==r){val[rt]=l;return;}
int mid=(l+r)>>1;
Build(ls[rt],l,mid);
Build(rs[rt],mid+1,r);
return;
}
inline void Modify(int rpt,int &rt,int pos,int l,int r,int new_val){
rt=++cnt;
if(l==r){val[rt]=new_val;return;}
int mid=(l+r)>>1;
if(pos<=mid) rs[rt]=rs[rpt],Modify(ls[rpt],ls[rt],pos,l,mid,new_val);
else ls[rt]=ls[rpt],Modify(rs[rpt],rs[rt],pos,mid+1,r,new_val);
return;
}
inline void Add(int id,int pos,int new_val){
Modify(root[id-1],root[id],pos,1,n,new_val);
return;
}
inline void InBuild(){
Build(root[0],1,n);
return;
}
inline int Query(int rt,int pos,int l,int r){
if(l==r) return val[rt];
int mid=(l+r)>>1;
if(pos<=mid) return Query(ls[rt],pos,l,mid);
else return Query(rs[rt],pos,mid+1,r);
}
inline int Q(int id,int x){
return Query(root[id],x,1,n);
}
inline void SetRoot(int p1,int p2){
root[p1]=root[p2];
return;
}
};
ChairManTree tree,depth;
inline int in(){
int x=0,c=getchar();
while(c<'0'||c>'9') c=getchar();
for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
return x;
}
int getf(int id,int p){
int k=tree.Q(id,p);
if(k==p) return k;
return getf(id,k);
}
inline int Qdp(int id,int p){
return depth.Q(id,p);
}
int main(){
freopen("bzoj_3974.in","r",stdin);
freopen("bzoj_3974.out","w",stdout);
n=in(),m=in();
tree.InBuild();
for(int i=1,a,b,op,d1,d2;i<=m;i++){
op=in();
if(op==1){
a=getf(i-1,in()^Ans),b=getf(i-1,in()^Ans);
if(a==b){
tree.SetRoot(i,i-1);
depth.SetRoot(i,i-1);
continue;
}
d1=Qdp(i-1,a),d2=Qdp(i-1,b);
if(d1==d2){
depth.Add(i,b,d1+1);
}
else{
if(d1>d2) a^=b,b^=a,a^=b;
depth.SetRoot(i,i-1);
}
tree.Add(i,a,b);
}
else if(op==2) a=in()^Ans,tree.SetRoot(i,a),depth.SetRoot(i,a);
else{
tree.SetRoot(i,i-1);
depth.SetRoot(i,i-1);
a=getf(i,in()^Ans),b=getf(i,in()^Ans);
printf("%d\n",Ans=(a==b));
}
}
return 0;
}