Cod sursa(job #2695181)

Utilizator Edwuard99Diaconescu Vlad Edwuard99 Data 11 ianuarie 2021 23:58:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.7 kb
#include <stdio.h>
#define maxN 100100

int R[maxN], Gr[maxN], N, M;

void update (int x, int y) {
	if (R[x] > R[y]) {
		Gr[y] = x;
	} else {
		Gr[x] = y;
	}

	if (R[x] == R[y]) {
		R[y] ++ ;
	}
}

int query (int x) {
	int R, aux;

	for (R = x; R != Gr[R]; R = Gr[R]);

	while (Gr[x] != x) {
		aux = Gr[x];
		Gr[x] = R;
		x = aux;
	}

	return R;
}

int main () {
	int i, t, x, y;

	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	scanf("%d%d", &N, &M);

	for (i = 1; i <= N; ++ i) {
		Gr[i] = i;
		R[i] = 1;
	}

	for ( ; M -- ; ) {
		scanf("%d%d%d", &t, &x, &y);
		if (t == 1) {
			update (query(x), query(y));
		} else {
			puts ((query (x) == query (y)) ? "DA" : "NU");
		}
	}
	return 0;
}