Cod sursa(job #1857161)

Utilizator GeorginskyGeorge Georginsky Data 25 ianuarie 2017 21:13:12
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
struct Element{int r, p;};
unordered_map<int,Element> u;
int n, m;
void make_set(int val){
    u[val].p=val;
    u[val].r=0;
}

int find_set(int val){
    int x=val, y, root;
    while(x!=u[x].p)x=u[x].p;
    root=x;
    while(x!=u[x].p){
        y=u[x].p;
        u[x].p=root;
        x=y;
    }
    return root;
}

void merge_sets(int x, int y){
    if(u[x].r>u[y].r){
        u[y].p=x;
    }else if(u[x].r<u[y].r){
        u[x].p=y;
    }else{
        u[y].p=x;
        u[y].r++;
    }
}

int main(){
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    cin>>n>>m;
    int op, a, b;
    for(int i=1; i<=n; i++)make_set(i);
    for(int i=1; i<=m; i++){
        cin>>op>>a>>b;
        if(op==1)merge_sets(a, b);
        else cout<<((find_set(a)==find_set(b))?"DA":"NU")<<"\n";
    }
    return 0;
}