Cod sursa(job #302602)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 9 aprilie 2009 03:57:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#define FIN "disjoint.in"
#define FOUT "disjoint.out"
#define MAX_N 100010
using namespace std;
int P[MAX_N];
int rank[MAX_N];
int N,M;


void iofile(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);

	scanf("%d%d",&N,&M);
	for (int i=1;i<=N;++i) {P[i]=i;rank[i]=0;}
}

int find_set(int x){

	if (x==P[x]){ return x;} else {P[x]=find_set(P[x]);return P[x];}
}

void merge_sets(int x,int y){

	int sx=find_set(x);
	int sy=find_set(y);
	if (rank[sx]<rank[sy]){P[sx]=sy;} else {P[sy]=sx;}
	if (rank[sx]==rank[sy]){++rank[sx];}
}

void solve(void){

	int cod,x,y;
	for (int i=1;i<=M;++i){

		scanf("%d%d%d",&cod,&x,&y);
		if (cod==1){ merge_sets(x,y);} else{
			int sx=find_set(x);
			int sy=find_set(y);
			if (sx==sy){ printf("DA\n");} else {printf("NU\n");}
		}
	}

	fclose(stdin);
	fclose(stdout);
	return ;
}

int main(void){

	iofile();
	solve();
	return 0;
}