Cod sursa(job #2690741)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 25 decembrie 2020 15:42:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

int dad[100001], rang[100001];
int N, M;

void ReadFile(){

    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
}

int Find(int x){
    int R, y;

    for(R = x;dad[R] != R;R = dad[R]);

    while(dad[x] != x){
        y = dad[x];
        dad[x] = R;
        x = y;
    }
    return R;
}

void Unite(int x, int y){

    if(rang[x] > rang[y]) dad[y] = x;
    else dad[x] = y;

    if(rang[x] == rang[y]) rang[y]++;
}

int main(){

    ReadFile();

    scanf("%d%d", &N, &M);

    for(int i = 1;i <= N;i++)
        dad[i] = i, rang[i] = 1;

    while(M--){

        int op, x, y;
        scanf("%d%d%d", &op, &x, &y);

        if(op == 2){
            if(Find(x) == Find(y)) printf("DA\n");
            else printf("NU\n");
        }else{
            Unite(Find(x), Find(y));      
        }
    }

}