可持久化并查集
3673:可持久化并查集 by zky
3674: 可持久化并查集加强版
const maxn1=10000100; maxn2=500000; var lson,rson,fa,deep:array[0..maxn1]of longint; root:array[0..maxn2]of longint; tot,n,m:longint; procedure swap(var x,y:longint); var i:longint; begin i:=x; x:=y; y:=i; end; procedure build(var x:longint;ll,rr:longint); var mid:longint; begin inc(tot); x:=tot; if ll=rr then begin fa[x]:=ll; exit; end; mid:=(ll+rr)>>1; build(lson[x],ll,mid); build(rson[x],mid+1,rr); end; procedure change(x,y,ll,rr,old:longint;var new:longint); var mid:longint; begin inc(tot); new:=tot; if ll=rr then begin fa[new]:=y; exit; end; mid:=(ll+rr)>>1; if x<=mid then begin rson[new]:=rson[old]; change(x,y,ll,mid,lson[old],lson[new]); end else begin lson[new]:=lson[old]; change(x,y,mid+1,rr,rson[old],rson[new]); end; end; function query(x,y,ll,rr:longint):longint; var mid:longint; begin if ll=rr then exit(x); mid:=(ll+rr)>>1; if y<=mid then exit(query(lson[x],y,ll,mid)) else exit(query(rson[x],y,mid+1,rr)) end; procedure add(x,y,ll,rr:longint); var mid:longint; begin if ll=rr then begin inc(deep[x]); exit; end; mid:=(ll+rr)>>1; if y<=mid then add(lson[x],y,ll,mid) else add(rson[x],y,mid+1,rr); end; function getfa(x,y:longint):longint; var ans:longint; begin ans:=query(x,y,1,n); if y=fa[ans] then exit(ans) else exit(getfa(x,fa[ans])) end; procedure into; begin tot:=0; readln(n,m); build(root[0],1,n); end; procedure work; var i,j,x,y,last:longint; begin last:=0; for i:=1 to m do begin read(j); root[i]:=root[i-1]; case j of 1:begin readln(x,y); x:=x xor last; y:=y xor last; x:=getfa(root[i],x); y:=getfa(root[i],y); if fa[x]<>fa[y] then begin if deep[x]>deep[y] then swap(x,y); change(fa[x],fa[y],1,n,root[i],root[i]); if deep[x]=deep[y] then add(root[i],fa[y],1,n); end; end; 2:begin readln(x); x:=x xor last; root[i]:=root[x]; end; 3:begin readln(x,y); x:=x xor last; y:=y xor last; x:=getfa(root[i],x); y:=getfa(root[i],y); if fa[x]<>fa[y] then last:=0 else last:=1; writeln(last); end; end; end; end; begin into; work; end.