Cod sursa(job #1700157)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 9 mai 2016 18:14:23
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
const int NMAX = 100505;
 
// REM's algorithm
int N, M, par[NMAX];
 
void init() {
    for (int i = 1; i <= N; i++) {
        par[i] = i;
    }
}
 
bool checkSameTree(int x, int y) {
    while (par[x] != par[y]) {
        if ((par[x] < par[y] && par[x] == x) || (par[y] < par[x] && par[y] == y)) {
            break ;
        }

        if (par[x] < par[y]) {
            x = par[x];
        } else {
            y = par[y];
        }
    }

    return par[x] == par[y];
}
 
void unite(int x, int y) {
    int z;
    while (par[x] != par[y]) {
        if (par[x] < par[y]) {
            if (par[x] == x) {
                par[x] = par[y];
                break ;
            }

            z = par[x];
            par[x] = par[y];
            x = z;
        } else {
            if (par[y] == y) {
                par[y] = par[x];
                break;
            }

            z = par[y];
            par[y] = par[x];
            y = z;
        }
    }
}
 
int main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
 
    scanf("%d%d", &N, &M);
    init();
    int type, x, y;
    for (int i = 1; i <= M; i++) {
        scanf("%d%d%d", &type, &x, &y);
        if (type == 1) {
            unite(x, y);
        } else {
            if (checkSameTree(x, y)) {
                printf("DA\n");
            } else {
                printf("NU\n");
            }
        }
    }
    return 0;
}