Cod sursa(job #697100)

Utilizator darkseekerBoaca Cosmin darkseeker Data 28 februarie 2012 22:12:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <cstdio>
using namespace std;

#define maxn 100007
#define in "disjoint.in"
#define out "disjoint.out"

int t[maxn],h[maxn];

inline void unite(int x,int y)
{
	if(h[x] > h[y])
		t[y] = x;
	else
		t[x] = t[y];
	if(h[x] == h[y])
		h[y]++;
}

inline int find(int x)
{
	int r = x,y = x;
	while(r != t[r])
		r = t[r];
	while(y != r)
		t[y] = r, y = t[r];
	return r;
}

int main()
{
	int N,M,i,type,x,y;
	freopen (in,"r",stdin);
	freopen (out,"w",stdout);
	
	scanf("%d %d",&N,&M);
	for(i = 1; i <= N; i++)
		t[i] = i , h[i] = 1;
	for(i = 1; i <= M; i++)
	{
		scanf("%d %d %d",&type,&x,&y);
		if(type == 1)
			unite(find(x),find(y));
		else
			if(find(x) == find(y))
				printf("DA\n");
			else
				printf("NU\n");
	}
	return 0;
}