Cod sursa(job #2500559)

Utilizator ancaoxoxSfia Anca ancaoxox Data 28 noiembrie 2019 10:43:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
//#include <iostream>
#include <fstream>

using namespace std;
int sz[100005];
int tata[100005];
int big_daddy(int a){
    int aux=a;
    while(aux!=tata[aux]){
        aux=tata[aux];
    }
    while(a!=tata[a]){
        int auxi=tata[a];
        tata[a]=aux;
        a=auxi;
    }
    return aux;
}
bool check(int a,int b){
    if(big_daddy(a)==big_daddy(b))
        return true;
    return false;
}

void unite(int a,int b){
    int ta=big_daddy(a),tb=big_daddy(b);
    if(ta!=tb){
        if(sz[ta]>sz[tb]){
            tata[tb]=ta;
            sz[ta]+=sz[tb];
        }
        else{
            tata[ta]=tb;
            sz[tb]+=sz[ta];
        }
    }
}

int main()
{
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    int n,m,cer,a,b;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        sz[i]=1;
        tata[i]=i;
    }
    for(int i=1;i<=m;i++){
        cin>>cer;
        if(cer==1){
            cin>>a>>b;
            unite(a,b);
        }
        else{
            cin>>a>>b;
            if(check(a,b)==true){
                cout<<"DA\n";
            }
            else{
                cout<<"NU\n";
            }
        }
    }
    return 0;
}