Pagini recente » Cod sursa (job #609855) | Cod sursa (job #2432658) | Cod sursa (job #2125901) | Cod sursa (job #1555794) | Cod sursa (job #1416280)
/*
folosind union-find
*/
#include <stdio.h>
#define NMax 100001
FILE *fin = fopen("disjoint.in", "rt");
FILE *fout = fopen("disjoint.out", "wt");
int n, m;
int p[NMax];
// per total : O(M * N)
int stramos(int i) {
while (p[i] != i) {
i = p[i];
}
return i;
}
// O(N)
void update(int x, int y) {
p[stramos(y)] = stramos(x);
}
// O(1) amortizat
int query(int x, int y) {
return (stramos(x) == stramos(y));
}
int main() {
fscanf(fin, "%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
p[i] = i;
}
int t, x, y;
while (m--) {
fscanf(fin, "%d %d %d", &t, &x, &y);
if (t == 1) {
// update: reunesc multimile nodurilor x si y
update(x, y);
} else {
// query: vreau sa stiu daca x si y sunt in aceeasi multime
if (query(x, y) == 1) {
fprintf(fout, "DA\n");
} else {
fprintf(fout, "NU\n");
}
}
}
fclose(fin);
fclose(fout);
return 0;
}