Cod sursa(job #669514)

Utilizator gegeadDragos Gegea gegead Data 27 ianuarie 2012 10:44:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include<cstdio>
int t[100001],h[100001];



int find(int x)
{
	int r,y;
	for(r=x;t[r]!=r;r=t[r]);
	while(t[x]!=r)
	{
		y=t[x];
		t[x]=r;
		x=y;
	}
	return r;
}


void Union(int x, int y)
{
	if(h[x]>h[y])
		t[y]=x;
	else
		if(h[x]==h[y])
		{
			++h[x];
			t[y]=x;
		}
		else
			t[x]=y;
}



int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	int n,m,i,p,x,y,tx,ty;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		t[i]=i;
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d",&p,&x,&y);
		if(p==1)
		{
			tx=find(x);
			ty=find(y);
			if(tx!=ty)
				Union(tx,ty);
		}
		else
			if(find(x)==find(y))
				printf("DA\n");
			else
				printf("NU\n");
	}
	return 0;
}