Cod sursa(job #261925)

Utilizator tvladTataranu Vlad tvlad Data 18 februarie 2009 21:15:05
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <cstdio>

const int NMAX = 100000;

int n,m;
int T[NMAX], SUB[NMAX];

int trace ( int x ) {
	int root;
	for (root = x; T[root] != root; root = T[root]);
	for (int a = x, b; a != root; b = T[a], T[a] = root, a = b);
	return root;
}

void unite ( int a, int b ) {
	int ta = trace(a);
	int tb = trace(b);
	if (SUB[ta] < SUB[tb]) ta ^= tb ^= ta ^= tb;
	T[tb] = ta;
	if (SUB[ta] == SUB[tb]) ++SUB[ta];
}

int main() {
	freopen("disjoint.in","rt",stdin);
	freopen("disjoint.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0; i < n; ++i) {
		T[i] = i;
		SUB[i] = 1;
	}
	for (int i = 0, cod,a,b; i < m; ++i) {
		scanf("%d %d %d",&cod,&a,&b);
		--a; --b;
		if (cod == 1)
			unite(a,b); else
			printf("%s\n",trace(a) == trace(b) ? "DA" : "NU");
	}
}