1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
const int N=2e5+5; int n,m,idx; int fa[N*20],lc[N*20],rc[N*20],dep[N*20]; int rt[N];
int build(int l,int r){ int x=++idx; if(l==r){ fa[x]=l; return x; } int mid=l+r>>1; lc[x]=build(l,mid); rc[x]=build(mid+1,r); return x; }
int upd(int val,int f,int l,int r,int root){ int x=++idx; if(l==r){ fa[x]=f; dep[x]=dep[root]; return x; } lc[x]=lc[root],rc[x]=rc[root]; int mid=l+r>>1; if(val<=mid) lc[x]=upd(val,f,l,mid,lc[root]); else rc[x]=upd(val,f,mid+1,r,rc[root]); return x; }
int query(int x,int l,int r,int val){ if(l==r) return x; int mid=l+r>>1; if(val<=mid) return query(lc[x],l,mid,val); else return query(rc[x],mid+1,r,val); }
int find(int ban,int x){ int f=query(ban,1,n,x); if(x==fa[f]) return f; return find(ban,fa[f]); }
signed main(){ n=gin(),m=gin(); rt[0]=build(1,n); for(int i=1;i<=m;i++){ int op=gin(); if(op==1){ rt[i]=rt[i-1]; int a=gin(),b=gin(); int u=find(rt[i],a),v=find(rt[i],b); if(fa[u]==fa[v]) continue; if(dep[u]>dep[v]) swap(u,v); rt[i]=upd(fa[u],fa[v],1,n,rt[i-1]); if(dep[u]==dep[v]) dep[v]++; } else if(op==2){ int k=gin(); rt[i]=rt[k]; } else { rt[i]=rt[i-1]; int a=gin(),b=gin(); int u=find(rt[i],a),v=find(rt[i],b); if(fa[u]==fa[v]) puts("1"); else puts("0"); } } return 0; }
|