Cod sursa(job #420471)

Utilizator slayer4uVictor Popescu slayer4u Data 19 martie 2010 13:10:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>

#define NMAX 100001

long a, b, code, n, m, rang[NMAX], p[NMAX];

long find(long x)
{
	if (x != p[x])
			p[x] = find(p[x]);
	return p[x];
}

void add(long x)
{
	p[x] = x;
	rang[x] = 0;
}

void join (long x, long y)
{
	if (rang[x] > rang[y])
			p[y] = x;
	else
	{
			p[x] = y;
			if (rang[y] == rang[x])
					++rang[y];
	}
}

void rejoin(long x, long y)
{
	join(find(x), find(y));
}

int main()
{
	freopen ("disjoint.in", "rt", stdin);
	freopen ("disjoint.out", "wt", stdout);

	scanf("%ld %ld", &n, &m);
	for (long i = 1; i <= n; ++i)
		add(i);

	for (long i = 1; i <= m; ++i)
	{
		scanf("%ld", &code);
		if (code == 1)
		{
			scanf("%ld %ld", &a, &b);
			rejoin(a, b);
		}
		else
		{
			scanf("%ld %ld", &a, &b);
			if (p[find(a)] == p[find(b)])
				printf("DA\n");
			else
				printf("NU\n");
		}

	}

	return 0;
}