Pagini recente » Cod sursa (job #1884197) | Cod sursa (job #1634868) | Cod sursa (job #1588034) | Statistici Stratulat Cristian (cristian_stratulat) | Cod sursa (job #1448076)
#include <cstdio>
#include <cassert>
#include <algorithm>
using namespace std;
#define _submit
#ifdef _submit
#define InFile "disjoint.in"
#define OtFile "disjoint.out"
#else
#define InFile "fis.in"
#define OtFile "fis.out"
#endif
#define MAXN 100010
int parinti[MAXN];
int H[MAXN];
void reuniune(int x, int y) {
int mx = x, tx = x;
while (parinti[mx] != -1)
mx = parinti[mx];
int my = y, ty = y;
while (parinti[my] != -1)
my = parinti[my];
if (H[my] < H[mx]) {
H[my] = H[mx];
parinti[my] = mx;
my = mx;
}
else if(H[mx] < H[my]) {
H[mx] = H[my];
parinti[mx] = my;
mx = my;
}
else {
H[mx]++;
H[my]++;
parinti[mx] = my;
mx = my;
}
while (parinti[tx] != -1) {
int aux = parinti[tx];
parinti[tx] = mx;
tx = aux;
}
while (parinti[ty] != -1) {
int aux = parinti[ty];
parinti[ty] = my;
ty = aux;
}
}
bool aresame(int x, int y) {
int mx = x, tx = x;
while (parinti[mx] != -1)
mx = parinti[mx];
while (parinti[tx] != -1) {
int aux = parinti[tx];
parinti[tx] = mx;
tx = aux;
}
int my = y, ty = y;
while (parinti[my] != -1)
my = parinti[my];
while (parinti[ty] != -1) {
int aux = parinti[ty];
parinti[ty] = my;
ty = aux;
}
if (mx == my)
return true;
return false;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OtFile, "w", stdout));
int N, M;
scanf("%d%d", &N, &M);
memset(parinti, 0xFF, N * sizeof(int));
memset(H, 0, N * sizeof(int));
for (int i = 0; i < M; i++) {
int op, a, b;
scanf("%d%d%d", &op, &a, &b);
if (op == 1)
reuniune(a-1, b-1);
else {
bool answer = aresame(a-1, b-1);
if (answer)
printf("DA\n");
else
printf("NU\n");
}
}
return 0;
}