Pagini recente » Cod sursa (job #3183885) | Cod sursa (job #2275429) | Cod sursa (job #2466882) | Cod sursa (job #167975) | Cod sursa (job #3150046)
#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);
if(a == b) return;
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;
}