Cod sursa(job #250294)

Utilizator firewizardLucian Dobre firewizard Data 30 ianuarie 2009 15:33:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#define egal(a,b)(a==b?"DA":"NU")
long m[1<<17],i,j,n,mut,op,nvi[1<<17],x,y;
void unire(long x,long y)
{
     if (nvi[x]>nvi[y]){
        m[y]=x;
        }
        else{
             m[x]=y;
             if(nvi[x]==nvi[y]);
             nvi[y]++;
             }
}
int cauta(int x)
{
     if (m[x]==x)
        return x;
     return (m[x]=cauta(m[x]));
}
int main()
{
    freopen ("disjoint.in","r",stdin);
    freopen ("disjoint.out","w",stdout);
    scanf("%ld %ld",&n,&mut);
    for(i=1;i<=n;++i)m[i]=i;
    for (;mut;--mut){
        scanf("%ld %ld %ld",&op,&x,&y);
        if(op==1)unire(m[x],m[y]);
        else{
             x=cauta(x);y=cauta(y);
             if(x==y)printf("DA\n");
             else printf("NU\n");
             }
        }     
    return 0;
}