Cod sursa(job #1184915)

Utilizator DenisacheDenis Ehorovici Denisache Data 14 mai 2014 16:51:38
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include <stdio.h>
#define NMAX 100005
int T[NMAX],R[NMAX],N,M,i,cod,x,y;
int find(int x)
{
    int R;
    for (R=x;T[R]!=R;R=T[R]);
    for (;T[x]!=x;) T[x]^=x^=T[x];
    return R;
}
void unite(int x,int y)
{
    if (R[x]>R[y]) T[y]=x;
    else T[x]=y;
    if (R[x]==R[y]) ++R[y];
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);
    scanf("%d %d",&N,&M);
    for (i=1;i<=N;i++) T[i]=i,R[i]=1;
    for (i=1;i<=M;i++)
    {
        scanf("%d %d %d",&cod,&x,&y);
        if (cod==1) unite(find(x),find(y));
        else
            if (find(x)==find(y)) printf("DA\n");
            else printf("NU\n");
    }
    return 0;
}