Cod sursa(job #3318331)

Utilizator DobraVictorDobra Victor Ioan DobraVictor Data 27 octombrie 2025 23:18:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
#include <stdint.h>

const int32_t MAX_N = 100000;

int32_t parents[MAX_N], sizes[MAX_N];

int32_t GetRoot(int32_t node) {
	while(parents[node] != -1)
		node = parents[node];
	return node;
}
void Merge(int32_t root1, int32_t root2) {
	if(sizes[root1] > sizes[root2]) {
		parents[root2] = root1;
	} else if(sizes[root2] > sizes[root1]) {
		parents[root1] = root2;
	} else {
		parents[root2] = root1;
		++sizes[root1];
	}
}

int main() {
	std::ifstream fin("disjoint.in");
	std::ofstream fout("disjoint.out");

	int32_t n, m;
	fin >> n >> m;

	for(int32_t i = 0; i != n; ++i)
		parents[i] = -1;
	
	for(int32_t i = 0; i != m; ++i) {
		int32_t c, x, y;
		fin >> c >> x >> y;
		--x; --y;

		int32_t root1 = GetRoot(x), root2 = GetRoot(y);
		if(c == 1) {
			Merge(root1, root2);
		} else {
			if(root1 == root2) {
				fout << "DA\n";
			} else {
				fout << "NU\n";
			}
		}
	}

	fin.close();
	fout.close();

	return 0;
}