Cod sursa(job #3150043)

Utilizator 23liviuStanescu Liviu 23liviu Data 14 septembrie 2023 15:37:55
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include "bits/stdc++.h"
//#pragma GCC optimize("Ofast")

#define def(name, locals, extra_arg, code, ret, before, after) struct name { locals; before ret operator() extra_arg after code };

def(dsu, 
	std::vector<int> parent; std::vector<int> opt;,
	(const int len), {
		parent.resize(len); 
		for(int i = 0; i < len; i++) parent[i] = i;
		
		opt.resize(len);
		std::fill(opt.begin(), opt.end(), 1);
	}, void, inline, );

def(dsu_find, 
	dsu& bind;, 
	(int t), {
		while(t != bind.parent[t])
			t = bind.parent[t] = bind.parent[bind.parent[t]];
		return t;
	}, int, [[nodiscard]] inline, );

def(dsu_merge, 
	dsu_find& find;, 
	(int a, int b), {
		a = find(a); b = find(b);

		auto opt = find.bind.opt;
		if(opt[a] < opt[b]) std::swap(a, b);

		find.bind.parent[b] = a;
		opt[a] += opt[a] == opt[b];
	}, void, inline, );

int main() {
	std::ios_base::sync_with_stdio(0);
	std::cin.tie(0);

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

	int n; std::cin >> n;
	dsu set{}; set(n+1); dsu_find find{set}; dsu_merge merge{find};

	int tests; std::cin >> tests; while(tests--) {
		int a, b, c; std::cin >> a >> b >> c;
		if(a == 1) {
			merge(b, c);
		} else {
			std::cout << (find(b) == find(c) ? "DA\n" : "NU\n");
		}
	}
	return 0;
}