Cod sursa(job #1493821)

Utilizator tiby10Tibi P tiby10 Data 29 septembrie 2015 22:29:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
#define MAXN 100005
int n, m, Set[MAXN], Size[MAXN];
vector<int> List[MAXN];

void Merge(int what, int where){
    while(!List[what].empty()){
        int node=List[what].back();
        List[what].pop_back();

        Set[node]=where;
        List[where].push_back(node);
    }
    Size[where]+=Size[what];
    Size[what]=0;
}

void Union(int a, int b){
    int m1=Set[a], m2=Set[b];
    if(Size[m1]<Size[m2])
        Merge(m1, m2);
    else Merge(m2, m1);
}

int main(){
    fin>>n>>m;
    int cod, x, y;
    for(cod=1; cod<=n; ++cod){
        Set[cod]=cod;
        List[cod].push_back(cod);
    }
    while(m--){
        fin>>cod>>x>>y;
        if(cod==1) Union(x, y);
        else fout<<((Set[x]==Set[y])?"DA\n":"NU\n");
    }
    return 0;
}