Cod sursa(job #605506)

Utilizator SpiderManSimoiu Robert SpiderMan Data 29 iulie 2011 19:24:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
# include <cstdio>

const char *FIN = "disjoint.in", *FOU = "disjoint.out";
const int MAX = 100005;

int N, M, T[MAX], R[MAX];

inline int search (int X) {
    if (X != T[X]) T[X] = search (T[X]);
    return T[X];
}

inline void unite (int X, int Y) {
    if (R[X] > R[Y]) T[Y] = X;
    else T[X] = Y;
    if (R[X] == R[Y]) ++R[Y];
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d", &N, &M);
    for (int i = 1; i <= N; ++i)
        T[i] = i, R[i] = 1;
    for (int i = 1, tip, x, y; i <= M; ++i) {
        scanf ("%d %d %d", &tip, &x, &y);
        if (tip == 2)
            printf ("%s\n", search (x) == search (y) ? "DA" : "NU");
        else unite (search (x), search (y));
    }
}