Cod sursa(job #240534)

Utilizator swift90Ionut Bogdanescu swift90 Data 7 ianuarie 2009 21:20:24
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include<stdio.h>
#define N 100100
int nr[N],rang[N];
int tata(int x){
	int rad,y;
	for(rad=x;nr[rad]!=rad;rad=nr[rad])
		;
	while(nr[x]!=x){
		y=nr[x];
		nr[x]=rad;
		x=y;
	}
	return rad;
}
void join(int x,int y){
	if(rang[x]>rang[y])
		nr[y]=x;
	else
		nr[y]=x;
	if(rang[x]==rang[y])
		++rang[y];
}
int main(){
	freopen("disjoint.in","r",stdin);
	freopen("disjoint.out","w",stdout);
	int n,m,i,x,a,b;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		nr[i]=i;
	for(i=0;i<m;++i){
		scanf("%d%d%d",&x,&a,&b);
		if(x==1)
			join(a,b);
		else{
			if(tata(a)==tata(b))
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}