[bzoj4668]冷战 -按秩合并并查集
题意
动态给点连边 询问两个点之间最早是在第几个操作连起来的
// 存个板:按秩合并并查集
一些补充(按秩合并):
树高不会超过logn
可以保留原始的信息
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=500003;
int n,m,las,fa[maxn],edge[maxn],deep[maxn],siz[maxn],tim;
int getfa(int x)
{
if(x==fa[x]) return x;
int tf=getfa(fa[x]);
deep[x]=deep[fa[x]]+1;
return tf;
}
void merge(int x,int y)
{
x=getfa(x); y=getfa(y);
if(x==y) return;
if(siz[x]>siz[y]) swap(x,y);
fa[x]=y; siz[y]+=siz[x];
edge[x]=tim;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) fa[i]=i,siz[i]=1;
for(int i=1,t0,t1,t2;i<=m;++i)
{
scanf("%d%d%d",&t0,&t1,&t2); t1^=las; t2^=las;
if(!t0) ++tim,merge(t1,t2);
else
{
las=0; int tx=getfa(t1),ty=getfa(t2);
if(tx!=ty) {puts("0"); continue;}
while(t1!=t2)
{
if(deep[t1]<deep[t2]) swap(t1,t2);
las=max(las,edge[t1]);
t1=fa[t1];
}
cout<<las<<'\n';
}
}
return 0;
}