Cod sursa(job #2435820)

Utilizator ShayTeodor Matei Shay Data 4 iulie 2019 13:28:28
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <string.h>

inline int read() {
	int n = 0;
	char c = getchar_unlocked();

	while (!('0' <= c && c <= '9')) {
		c = getchar_unlocked();
	}

	while ('0' <= c && c <= '9') {
		n = (n << 3) + (n << 1) + c - '0';
		c = getchar_unlocked();
	}

	return n;
}

int find (int x, int parent[]) {
	
	while (parent[x] != x) {
		x = parent[x];
	}

	return x;
}

void unite (int x, int y, int parent[], int rang[]) {
	if (rang[x] > rang[y]) {
		parent[y] = x;
	} else {
		parent[x] = y;
	}

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

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

	int n, m, x, y, query;

	n = read(), m = read();

	int parent[n + 1], rang[n + 1];

	memset(rang, 1, sizeof(rang));

	for (int i = 1 ; i <= n ; ++i) {
		parent[i] = i;
	}

	for (; m ; --m) {
		query = read(), x = read(), y = read();

		switch (query) {
			case 1: unite(find(x, parent), find(y, parent), parent, rang);
					break;
			case 2: if (find(x, parent) == find(y, parent)) {
						putchar('D'), putchar('A'), putchar('\n');
					} else {
						putchar('N'), putchar('U'), putchar('\n');
					}
					break;
			default: break;
		}
	}

	return 0;
}