Cod sursa(job #441522)

Utilizator mordredSimionescu Andrei mordred Data 12 aprilie 2010 22:49:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
// Simionescu Andrei, -/-/2010
// http://infoarena.ro/problema/disjoint
// Dificultate: - 
// Categorii: -

#include <cstdio>
using namespace std;
	
#define NMAX 100020	

int n, m;
int t[NMAX], r[NMAX];


int search(int);
void merge(int, int);

int main()
{
	freopen( "disjoint.in", "r", stdin );
	freopen( "disjoint.out", "w", stdout );
	
	scanf("%d %d ", &n, &m);

	int i, x, y, cd;

	for (i = 1; i <= n; ++i)
	{
		t[i] = i;
		r[i] = 1;
	}

	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &cd, &x, &y);
		
		if (cd == 2)
        {
			if(search(x) == search(y))
                printf("DA\n");
			else
                printf("NU\n");
		}
		else
			merge(search(x), search(y));
	}

	return 0;
}

int search(int x)
{
	int root = x, y;

	while(t[root] != root)
	   root = t[root];

	while(t[x] != x)
	{
		y = t[x];
		t[x] = root;
		x = y;
	}
	
	return root;
}

void merge(int x, int y)
{
	if(r[x] > r[y])
	    t[y] = x;
	else
        t[x] = y;

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