Cod sursa(job #261020)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 17 februarie 2009 20:11:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <cstdio>

#define v 100020

int e[v], rang[v];
int n, m;

int find(int x)
{
	int R, y;
	for (R=x; e[R]!=R; R=e[R]);
	for (; e[x]!=x; )
	{
		y=e[x];
		e[x]=R;
		x=y;
	}
	return R;
}

void unite(int x, int y)
{
	if (rang[x]>rang[y])
		e[y]=x;
    else e[x]=y;
	if (rang[x]==rang[y])
        rang[y]++;
}

int main()
{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	scanf("%d %d ", &n, &m);
	int x, y, cd;
	for (int i=1; i<=n; i++)
	{
		e[i]=i;
		rang[i]=1;
	}
	for (int i=1; i<=m; i++)
	{
		scanf("%d %d %d", &cd, &x, &y);
		if (cd==2)
		{
			if (find(x)==find(y))
                printf("DA\n");
            else printf("NU\n");
        }
        else
            unite(find(x), find(y));
	}

	return 0;
}