Cod sursa(job #2444723)

Utilizator Leonard123Mirt Leonard Leonard123 Data 1 august 2019 11:31:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
using namespace std;
#define maxn 100005
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int arb[maxn], rang[maxn],n,m;

int fi(int x){
    int R,y;
    for(R=x; arb[R]!=R; R=arb[R]);
    for(; arb[x]!=x; x=arb[x]){
        y=arb[x];
        arb[x]=R;
        x=y;
    }
    return R;
}

void unite(int x, int y){
    if(rang[x]>rang[y])
        arb[y]=x;
    else arb[x]=y;

    if(rang[x]==rang[y])
        rang[y]++;

}

int main()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++){
        arb[i]=i;
        rang[i]=1;
    }
    int x,y,c;
    while(m){
        cin>>c>>x>>y;
        if(c==1){
            if(fi(x)!=fi(y))
                unite(fi(x),fi(y));
        }else{
            if(fi(x)==fi(y))
                cout<<"DA\n";
            else
                cout<<"NU\n";
        }
        m--;
    }
}