#include<bits/stdc++.h> using namespace std; typedef long long LL; #define mid ((l+r)>>1) const int INF=1e9+7,MAXNODE=24e6+7,MAXN=1e6+7; int N,M,tmp[MAXN],rt[MAXN]; int fa[MAXNODE],dep[MAXNODE],lson[MAXNODE],rson[MAXNODE],sz; void init(int &x,int l,int r){ x=++sz; if(l==r){ fa[x]=l; return; } init(lson[x],l,mid); init(rson[x],mid+1,r); } void modify(int &x,int l,int r,int p/*pre*/,int q/*pos*/,int v){ x=++sz; if(l==r){ fa[x]=v; dep[x]=dep[p]; return; } lson[x]=lson[p]; rson[x]=rson[p]; if(q<=mid) modify(lson[x],l,mid,lson[p],q,v); else modify(rson[x],mid+1,r,rson[p],q,v); } int query(int x,int l,int r,int q){ if(l==r) return x; if(q<=mid) return query(lson[x],l,mid,q); return query(rson[x],mid+1,r,q); } int findset(int edit,int loc){ int f=query(edit,1,N,loc); if(fa[f]==loc) return f; return findset(edit,fa[f]); } void add_dep(int x,int l,int r,int loc){ if(l==r){ dep[x]++; return; } if(loc<=mid) add_dep(lson[x],l,mid,loc); else add_dep(rson[x],mid+1,r,loc); } int main(){ scanf("%d%d",&N,&M); init(rt[0],1,N); for(int i=1;i<=M;i++){ int opt; scanf("%d",&opt); if(opt==1){ rt[i]=rt[i-1]; int a,b; scanf("%d%d",&a,&b); int f1=findset(rt[i],a),f2=findset(rt[i],b); if(dep[f1]>dep[f2]) swap(f1,f2); modify(rt[i],1,N,rt[i-1],fa[f1],fa[f2]); if(dep[f1]==dep[f2]) add_dep(rt[i],1,N,fa[f2]); }else if (opt==2){ int edit; scanf("%d",&edit); rt[i]=rt[edit]; }else{ rt[i]=rt[i-1]; int a,b; scanf("%d%d",&a,&b); int f1=findset(rt[i],a),f2=findset(rt[i],b); puts(f1==f2?"1":"0"); } } return 0; }
相关文章: