Cod sursa(job #1896202)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 28 februarie 2017 15:44:47
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <stack>
using namespace std;

int node[100001][2];

int Find(int target){
    stack<int> path;

    while(node[target][1] != target){
        if(node[node[target][1]][1] != node[target][1]){
            path.push(target);
        }
        target = node[target][1];
    }
    while(!path.empty()){
        node[path.top()][1] = target;
        path.pop();
    }
    return target;
}
void Union(int x, int y){
    int rootX = Find(x);
    int rootY = Find(y);

    if(node[rootX][0] > node[rootY][0]){
        node[rootY][1] = rootX;
    }else{
        if(node[rootX][0] == node[rootY][0]){
            node[rootY][0]++;
        }
        node[rootX][1] = rootY;
    }
}

int main(){

    int sets, queries, task, x, y;

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

    scanf("%d %d", &sets, &queries);

    for(int i = 1; i <= sets; i++){
        node[i][0] = 1;
        node[i][1] = i;
    }
    for(int i = 1; i <= queries; i++){
        scanf("%d %d %d", &task, &x, &y);

        if(task == 1){
            Union(x, y);
        }else{
            printf("%s\n", (Find(x) == Find(y)) ? "DA" : "NU");
        }
    }
    return 0;
}