Cod sursa(job #1341377)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 12 februarie 2015 17:54:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>

using namespace std;

#define inFile "disjoint.in"
#define outFile "disjoint.out"
#define MAX_N 100001

int r[MAX_N];
int h[MAX_N];

inline int findSet(int x) {
    int y = x, aux;
    while(x != r[x])
        x = r[x];
    while(y != r[y]) {
        aux = r[y];
        r[y] = x;
        y = aux;
    }
    return x;
}

inline void unionSet(int x, int y) {
    if(h[x] == h[y])
        ++h[x], r[y] = x;
    else if(h[x] < h[y])
        r[x] = y;
    else
        r[y] = x;
}

int main() {
    freopen(inFile, "r", stdin);
    freopen(outFile, "w", stdout);
    
    int n, m, i, op, x, y, r1, r2;
    
    scanf("%d %d", &n, &m);
    
    for(i = 1; i <= n; i++)
        r[i] = i, h[i] = 1;
    for(i = 1; i <= m; i++) {
        scanf("%d %d %d", &op, &x, &y);
        if(op == 1) {
            r1 = findSet(x);
            r2 = findSet(y);
            unionSet(r1, r2);
        }
        else {
            if(findSet(x) == findSet(y))
                printf("DA\n");
            else
                printf("NU\n");
        }
    }
    
    return 0;
}