Cod sursa(job #3158134)

Utilizator robeteaRobert Cristea robetea Data 17 octombrie 2023 20:27:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <bits/stdc++.h>

struct dsu {
	std::vector<int> p, o;

	void reset(int len) {
		p.resize(len);
		o.resize(len);
		std::fill(o.begin(), o.end(), 1);
		for(int i = 0; i < len; i++) p[i] = i;
	}

	int find(int t) noexcept {
		while(t != p[t]) t = p[t] = p[p[t]];
		return t;
	}

	bool same_set(int a, int b) noexcept { return find(a) == find(b); }

	void merge(int a, int b) noexcept { 
		a = find(a); b = find(b); 
		if(a == b) return;

		if(o[a] < o[b]) std::swap(a, b);
		p[b] = a;
		o[a] += o[a] == o[b];
	}
};

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

	int n, m; std::cin >> n >> m;
	dsu set; set.reset(n + 5);

	while(m--) {
		int cod, x, y; std::cin >> cod >> x >> y;
		if(cod == 1) set.merge(x, y);
		else std::cout << (set.same_set(x, y) ? "DA" : "NU") << '\n';
	}
	return 0;
}