Cod sursa(job #631719)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 9 noiembrie 2011 18:28:33
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>

using namespace std;

const int N=100001;

struct punct{
	int tata,h;
}v[N];

int n,m;

inline int root(int x){
	int rad,clonex,inaltime=0;
	clonex=x;
	while(v[x].tata!=x){
		x=v[x].tata;
		inaltime++;
	}
	rad=x;
	x=clonex;
	v[x].h=inaltime;
	while(v[x].tata!=x){
		v[x].tata=rad;
		v[x].h=inaltime;
		x=v[x].tata;
	}
	return rad;
}
	

void citire(){
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	int i,op,x,y,radx,rady;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i){
		v[i].tata=i;
	}
	for(i=1;i<=m;++i){
		scanf("%d%d%d",&op,&x,&y);
		radx=root(x);
		rady=root(y);
		if(op==1){
			if(v[radx].h<v[rady].h){
				v[radx].tata=rady;
			}
			else{
				v[rady].tata=radx;
			}
		}
		else{
			if(radx==rady)
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
}

int main(){
	citire();
	return 0;
}