Cod sursa(job #871067)

Utilizator alexdmotocMotoc Alexandru alexdmotoc Data 4 februarie 2013 13:08:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define maxN 100005

int tata[maxN] , H[maxN];

int root (int node)
{
	int R;
	
	for (R = node ; R != tata[R] ; R = tata[R]);
	for (int x = node ; x != R ; x = tata[x] , tata[x] = R);
	
	return R;
}

void update (int x , int y)
{
	int rootX = root(x);
	int rootY = root(y);
	
	if (H[rootX] == H[rootY])
	{
		++H[rootX];
		tata[rootY] = rootX;
	}
	
	else if (H[rootX] < H[rootY])
		tata[rootX] = rootY;
	
	else tata[rootY] = rootX;
}

int main()
{
	freopen ("disjoint.in" , "r" , stdin);
	freopen ("disjoint.out" , "w" , stdout);
	
	int N , M;
	
	scanf ("%d %d" , &N , &M);
	
	for (int i = 1 ; i <= N ; ++i)
		tata[i] = i;
	
	int x , y , cod;
	
	while (M --)
	{
		scanf ("%d %d %d" , &cod , &x, &y);
		
		if (cod == 1)
			update (x , y);
		
		else
		{
			if (root(x) == root(y))
				printf ("DA\n");
			
			else printf ("NU\n");
		}
	}
	
	return 0;
}