Cod sursa(job #257575)

Utilizator BaduBadu Badu Badu Data 13 februarie 2009 16:53:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>

#define IN "disjoint.in"
#define OUT "disjoint.out"
#define NMAX 100001
#define ll long long

ll Tata[NMAX],Rang[NMAX];
ll n,m;

void Union(ll x,ll y){

	if(Rang[x]>Rang[y]) Tata[y]=x;

	else {

		Tata[x]=y;

		if(Rang[x]==Rang[y]) Rang[y]++;

	}
}

ll Find(int x){

	ll Root=x,tata;

	while(Tata[Root]!=Root) Root=Tata[Root];

	for( ; x!=Root ; ) {

		tata = Tata[x];
		Tata[x] = Root;
		x = tata;

	}

	return Root;

}

int main(){

	freopen(IN,"rt",stdin);
	freopen(OUT,"wt",stdout);

	scanf("%d%d",&n,&m);
	int i,o;
	ll x,y;
	for(i=1;i<=n;i++) {
		Tata[i]=i;
		Rang[i]=1;
	}

	for(;m--;){

		scanf("%d%d%d",&o,&x,&y);

		if(o==1)  Union(Find(x),Find(y));
		else {
			if(Find(x)==Find(y)) printf("DA\n");
			else printf("NU\n");
		}
	}

	return 0;
}