Pagini recente » Cod sursa (job #1014796) | Cod sursa (job #2957242) | Cod sursa (job #3215989) | Cod sursa (job #1901325) | Cod sursa (job #2939350)
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
#define maxn 100001
int tata[maxn], rang[maxn];
int n, m;
int root(int x) {
vector<int> v;
if (x == tata[x]) return x;
else {
while (tata[x] != x) {
v.push_back(x);
tata[x] = tata[tata[x]];
x = tata[x];
}
for (auto nod: v)
tata[nod] = x;
return x;
}
}
void unire(int x, int y) {
int r1 = root(x);
int r2 = root(y);
if (rang[r1] <= rang[r2]) {
tata[r1] = r2;
rang[r2] += rang[r1];
} else {
tata[r2] = r1;
rang[r1] += rang[r2];
}
}
int main() {
int op, x, y;
f >> n >> m;
for (int i = 1; i <= n; i++) {
tata[i] = i;
rang[i] = 1;
}
for (int i = 0; i < m; i++) {
f >> op >> x >> y;
if (op == 1)
unire(x, y);
else if (op == 2) {
if (root(x) == root(y))
g << "DA" << '\n';
else
g << "NU" << '\n';
}
}
f.close();
g.close();
return 0;
}