Cod sursa(job #2912378)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 8 iulie 2022 02:15:37
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int v[100000],p[100000];
void reassign(int node,int root){
    int res;
    while(node != p[node]){
        res = p[node];
        p[node] = root;
        node = res;
    }
}
int root(int a){
    while(a != p[a])a = p[a];
    return a;
}
void mrg(int a,int b){
    int cb = b;
    int ca = a;
    a = root(a);
    b = root(b);
    if(v[a] < v[b]){
        swap(a,b);
    }
    p[b] = a;
    v[a] = v[a] + v[b];
    v[b] = -1;
    ///a is parent
    reassign(ca,a);
    reassign(cb,a);
}
bool query(int a,int b){
    int cb = b;
    int ca = a;
    a = root(a);
    b = root(b);
    reassign(ca,a);
    reassign(cb,b);
    return a == b;
}
int main()
{
    int n,m,i,cer,a,b;
    fin>>n>>m;
    for(i = 0;i < n;i++){
        p[i] = i;
        v[i] = 1;
    }
    for(i = 0;i < m;i++){
        fin>>cer>>a>>b;
        a--;
        b--;
        if(cer == 1){
            mrg(a,b);
        }else if(query(a,b))fout<<"DA\n";
        else fout<<"NU\n";
    }
    return 0;
}