Cod sursa(job #249382)

Utilizator vlad_popaVlad Popa vlad_popa Data 28 ianuarie 2009 11:40:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <cstdio>

int p[1<<17], h[1<<17];
int N, M;

void unite (int n1, int n2) {
    if (h[n1] > h[n2])
        p[n2] = n1;
    else {
        p[n1] = n2;
        if (h[n1] == h[n2])
            ++h[n2];
    }
}

int find (int n) {
    if (p[n] == n) return n;
    return p[n] = find(p[n]);
}

int main () {
    freopen ("disjoint.in", "r", stdin);
    freopen ("disjoint.out", "w", stdout); 
    
    scanf ("%d %d", &N, &M);
    for (int i = 1; i <= N; ++ i) p[i] = i;
    
    int op, x, y;
    for (; M; -- M) {
        scanf (" %d %d %d", &op, &x, &y);
        if (op == 1) unite (p[x], p[y]);
        else printf ("%s\n", find(x) == find(y) ? "DA" : "NU");
    }
    
    return 0;
}