Cod sursa(job #2435808)

Utilizator ShayTeodor Matei Shay Data 4 iulie 2019 13:24:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 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[]) {
	int root, temp;

	for (root = x; parent[root] != root ; root = parent[root]);

	while (parent[x] != x) {
		temp = parent[x];
		parent[x] = root;
		x = temp;
	}

	return root;
}

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;
}