Cod sursa(job #605504)

Utilizator SpiderManSimoiu Robert SpiderMan Data 29 iulie 2011 19:18:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 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) {
    int rang;
    for (rang = X; T[rang] != rang; rang = T[rang]);
    for (int aux; T[X] != X;) {
        aux = T[X];
        T[X] = rang;
        X = aux;
    }
    return rang;
}

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));
    }
}