Cod sursa(job #1212885)

Utilizator pulseOvidiu Giorgi pulse Data 26 iulie 2014 13:17:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>
#define nmax 100005

using namespace std;

int n, q, type, x, y, TT[nmax], RG[nmax];

int Find(int x)
{
	int R, y;

	for (R = x; TT[R] != R; R = TT[R]);

	for (; TT[x] != x;)
	{
		y = TT[x];
		TT[x] = R;
		x = y;
	}

	return R;
}

void Unite(int x, int y)
{
	if (RG[x] > RG[y])
		TT[y] = x;
	else
		TT[x] = y;

	if (RG[x] == RG[y])
		++RG[y];
}

int main()
{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	scanf("%d%d", &n, &q);
	for (int i = 1; i <= n; ++i)
	{
		TT[i] = i;
		RG[i] = 1;
	}
	for (; q; --q)
	{
		scanf("%d%d%d", &type, &x, &y);
		if (type == 2)
		{
			if (Find(x) == Find(y))
				printf("DA\n");
			else
				printf("NU\n");
		}
		else
		{
			int a = Find(x);
			int b = Find(y);
			Unite(a, b);
		}
	}

	return 0;
}