Cod sursa(job #705396)
#include <cstring>
#include <cstdio>
#include <cmath>
int n, m;
int dis[100008];
int wgt[100008];
int fall(int f) {
while (dis[f] != f) {
dis[f] = dis[dis[f]];
f = dis[f];
}
return(f);
}
int connect(int a, int b) {
a = fall(a);
b = fall(b);
if (a != b) {
if (wgt[a] < wgt[b]) {
wgt[a] += wgt[b];
dis[b] = a;
} else {
wgt[b] += wgt[a];
dis[a] = b;
}
}
}
bool connected(int a, int b) {
a = fall(a);
b = fall(b);
return(a == b);
}
int main() {
FILE * in = fopen("disjoint.in", "rt");
FILE * out = fopen("disjoint.out", "wt");
fscanf(in, "%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
dis[i] = i;
}
while (m--) {
int x, y, z;
fscanf(in, "%d%d%d", &x, &y, &z);
if (x == 2) {
if (connected(y, z)) {
fputs("DA\n", out);
} else {
fputs("NU\n", out);
}
} else {
connect(y, z);
}
}
fclose(in);
fclose(out);
}