Cod sursa(job #2686427)

Utilizator alex02Grigore Alexandru alex02 Data 19 decembrie 2020 10:08:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 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;
}