1. 程式人生 > 實用技巧 >[bzoj4668]冷戰 -按秩合併並查集

[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;
}