Cod sursa(job #1146924)

Utilizator SilverGSilver Gains SilverG Data 19 martie 2014 13:46:44
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
/*
		Keep It Simple!
*/

#include<stdio.h>

#define MaxN 100001


int N,M,Tree[MaxN],type,x,y;
int Level[MaxN];

void Initialise_Tree()
{
		for(int i=1;i<=M;i++)
		{
				Tree[i] = i;
				Level[i] = 1;
		}
}

void Add(int x,int y)
{
		if(Level[x] >= Level[y])
		{
				Tree[y] = x;
				Level[x] += 1;
		}
		else
				Tree[x] = y;
}

int Find(int node)
{
		int root;
		for(root = node; Tree[root] != root; root = Tree[root]);

	  for(;node != root;)
	  {
				int aux = Tree[node];
				Tree[node] = root;
				node = aux;
		}

		return root;
}

void Query(int x,int y)
{
		if( Find(x) == Find(y) )
				printf("DA\n");
		else
				printf("NU\n");
}

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

		scanf("%d%d",&N,&M);

		Initialise_Tree();

		while(M--)
		{
				scanf("%d%d%d",&type,&x,&y);
				if(type == 1)
						Add(Find(x),Find(y));
				else if(type == 2)
						Query(x,y);
		}
}