Pagini recente » Cod sursa (job #2577887) | Cod sursa (job #2392650) | Cod sursa (job #1162007) | Cod sursa (job #850188) | Cod sursa (job #1416281)
/*
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 v[NMax], k;
int stramos(int i) {
k = 0;
while (p[i] != i) {
v[k++] = i;
i = p[i];
}
for (int j = 0; j < k; j++) {
p[v[j]] = 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;
}