Cod sursa(job #2512288)

Utilizator radustn92Radu Stancu radustn92 Data 20 decembrie 2019 20:29:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100505;

int N, ops;
int parent[NMAX], size[NMAX];

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

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

	return root;
}

void merge(int x, int y) {
	int rootX = find(x), rootY = find(y);

	if (rootX == rootY) {
		return;
	} else {
		if (size[rootX] < size[rootY]) {
			swap(rootX, rootY);
		}
		parent[rootY] = rootX;
		size[rootX] += size[rootY];
	}
}

bool inSameSet(int x, int y) {
	return find(x) == find(y);
}

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

	scanf("%d%d", &N, &ops);
	for (int i = 1; i <= N; i++) {
		parent[i] = i;
		size[i] = 1;
	}

	int opType, x, y;
	for (int op = 0; op < ops; op++) {
		scanf("%d%d%d", &opType, &x, &y);
		switch (opType) {
			case 1:
				merge(x, y);
				break;
			case 2:
				printf("%s\n", inSameSet(x, y) ? "DA" : "NU");
				break;
		}
	}
	return 0;
}