[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;
}
posted @ 2020-12-26 12:16  wuwendongxi  阅读(99)  评论(0编辑  收藏  举报