Cod sursa(job #1070438)

Utilizator roby2001Sirius roby2001 Data 1 ianuarie 2014 00:15:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
/*
    Keep It Simple!
*/
 
#include<stdio.h>
#include<list>

using namespace std;

int n,m;
int r,x,y;

int Tree[100001],Rang[100001];

void Init()
{
	for(int i=1; i<=n; i++)
	{
		Tree[i] = i;
		Rang[i] = 1;
	}
}

void AddStack(int a,int b)
{
	if(Rang[a] < Rang [b])
      Tree[b] = a;
	else
	  Tree[a] = b;

	if(Rang[a] == Rang[b]) Rang[b]++;
}

int FindStack(int a)
{
	int i,aux;

	for(i = a; Tree[i] != i; i=Tree[i]);

    while( Tree[a] != a )
	{
		aux = Tree[a];
		Tree[a] = i;
		a = aux;
	}

	return i;
}

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

	scanf("%d %d",&n,&m);

	Init();

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

}