BZOJ4668: 冷战
并查集,按秩合并,树高log,暴力查询。
#include<cstdio> const int N=5e5+5; int f[N],d[N],r[N],p[N]; int bel(int i){ if(p[i]==i) return i; int j=bel(p[i]); d[i]=d[p[i]]+1; return j; } int join(int i,int j){ i=bel(i); j=bel(j); if(i==j)return 0; if(r[i]==r[j])++r[j]; if(r[i]<r[j]){ p[i]=j; return i; } p[j]=i; return j; } int ask(int i,int j){ int s=0; if(bel(i)==bel(j)) while(i!=j) if(d[i]>d[j]) s<f[i]?s=f[i]:0,i=p[i]; else s<f[j]?s=f[j]:0,j=p[j]; return s; } int n,m,k,s,t,l; int main(){ scanf("%d%d",&n,&m); for(;n;--n)p[n]=n; while(m--){ scanf("%d%d%d",&k,&s,&t); s^=l,t^=l; if(k) printf("%d\n",l=ask(s,t)); else f[join(s,t)]=++n; } }