Cod sursa(job #1195023)

Utilizator xtreme77Patrick Sava xtreme77 Data 5 iunie 2014 19:23:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#define MAX 101010
using namespace std;
int rang[MAX],tata[MAX],n,m;
void unim(int x,int y);
int binary_log_sh(int x);
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;tata[i]=i,rang[i]=1,++i);
    for(int i=1;i<=m;++i){
        int op,x,y;
        scanf("%d%d%d",&op,&x,&y);
        if(op==2){
            if(binary_log_sh(x) == binary_log_sh(y))printf("DA\n");
                else printf("NU\n");
        }
        else
            unim(binary_log_sh(x),binary_log_sh(y));

    }
    return 0;
}
void unim(int x,int y){
    if(rang[x]>rang[y])tata[y]=x;
        else tata[x]=y;
    if(rang[x] == rang[y])++rang[y];
}
int binary_log_sh(int x){
    int q,aux;
    for(q=x;tata[q]!=q;q=tata[q]);
    for(;tata[x]!=x;aux=tata[x],tata[x]=q,x=aux);
    return q;
}