Pagini recente » Cod sursa (job #2835417) | Cod sursa (job #2630952) | Cod sursa (job #75609) | Cod sursa (job #320669) | Cod sursa (job #2890291)
#include <bits/stdc++.h>
using namespace std;
class DisjointSet {
unordered_set <int> parents;
unordered_map<int, int> parent;
unordered_map<int, int> size;
unordered_map<int, int> rank;
public:
int find(int v) {
if (parent[v] == v) {
return v;
}
// path compression
parent[v] = find(parent[v]);
return parent[v];
}
void add(int v) {
if (parent.find(v) != parent.end()) {
return; // element already exists
}
parent[v] = v;
parents.insert(v);
size[v] = 1;
rank[v] = 1;
}
void unite(int u, int v) {
u = find(u);
v = find(v);
if (rank[u] < rank[v]) {
parent[u] = v;
size[v] += size[u];
} else if (rank[v] < rank[u]) {
parent[v] = u;
size[u] += size[v];
} else {
parent[u] = v;
size[v] += size[u];
rank[v]++;
}
}
};
int main() {
#ifndef ONLINE_JUDGE
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
#endif
int n, m;
DisjointSet dj_set;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
dj_set.add(i);
}
int op_type, x, y;
while(m--) {
cin >> op_type >> x >> y;
if (op_type == 1) {
dj_set.unite(x, y);
} else {
cout << (dj_set.find(x) == dj_set.find(y) ? "DA\n" : "NU\n");
}
}
return 0;
}