Cod sursa(job #678314)

Utilizator lianaliana tucar liana Data 11 februarie 2012 13:56:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <stdio.h>
#define nmax 100005
long i, z, zz, n, m, op, x, y, urm, r, lg[nmax], t[nmax];


long rad(long z)
{
	zz=z;
	while (t[z]>0)
		z=t[z];
	r=z;	
	z=zz;
	while (t[z]>0)
	{
		urm=t[z];
		t[z]=r;
		z=urm;
	}
	return r;
}

int main()
{
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for (i=1;i<=n;i++)
		lg[i]=1;
	for (i=1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&op,&x,&y);
		if (op==1)
		{
			x=rad(x);	y=rad(y);
			if (lg[x]<lg[y])
				t[x]=y;
			else
			{
				t[y]=x;
				if (lg[x]==lg[y])
					lg[y]++;
			}
		}
		else
		{
			if (rad(x)==rad(y))
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
	return 0;
}