Cod sursa(job #2512537)

Utilizator alex02Grigore Alexandru alex02 Data 21 decembrie 2019 11:28:42
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int n, m;
int arb[100002], inalt[100002];

int gaseste_papa(int a){
    while(arb[a] != a){
        a = arb[a];
    }
    return a;
}

void union_(int a, int b){
    a = gaseste_papa(a);
    b = gaseste_papa(b);
    if(inalt[a] < inalt[b]){
        arb[a] = b;
        inalt[b] += a;
    }else{
        arb[b] = a;
        inalt[a] += b;
    }
}
bool find(int a, int b){
    return (gaseste_papa(a) == gaseste_papa(b));
}

void citire(){
    for(int i = 1; i <= n; ++i){
        arb[i] = i;
        inalt[i] = 1;
    }
}

int main(){
    f >> n >> m;
    citire();
    for(int i = 0; i < m; ++i){
        int op, a, b;
        f >> op >> a >> b;
        if(op == 1){
            union_(a, b);
        }else{
            if(find(a, b))
                g << "DA\n";
            else
                g << "NU\n";
        }
    }
    return 0;
}