Cod sursa(job #2140401)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 23 februarie 2018 14:04:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <bits/stdc++.h>
#define nmax 100002

using namespace std;

ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");

int n,m,t[nmax],r[nmax];

int findd(int q){
    int R,y;
    for(R=q;t[R]!=R;R=t[R]);
    while(t[q]!=q){
        y=t[q];
        t[q]=R;
        q=y;
    }
    return R;
}

void merg(int q, int qq){
    if(r[q]>r[qq])
        t[qq]=q;
    else
        t[q]=qq;
    if(r[qq]==r[q])r[qq]++;
}

int main()
{
    int a,b,c;
    fin>>n>>m;
    for(int i=1;i<=n;++i){
        r[i]=1;
        t[i]=i;
    }
    for(int i=1;i<=m;++i){
        fin>>a>>b>>c;
        if(a==2){
            if(findd(b)==findd(c))fout<<"DA\n";
            else fout<<"NU\n";
        }
        else{
            merg(findd(b),findd(c));
        }
    }
    return 0;
}