Cod sursa(job #260589)

Utilizator catalina5catalina serban catalina5 Data 17 februarie 2009 11:32:49
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

int n,m,cod,x,y,Tx,Ty;
int tata[100010];
int niv[100100];

int rad(int x)
{
     int aux=x;
     while (tata[x]!=x)
     {
          x=tata[x];
     }

     while (tata[aux]!=aux)
     {
          aux=tata[aux];
          tata[aux]=x;
     }

     return x;
}

void rez()
{
     Tx=rad(x);
     Ty=rad(y);
     if (Tx==Ty)
          return ;
     else
     {
          if (niv[Tx]>niv[Ty])
               tata[Ty]=Tx;
          else
               tata[Tx]=Ty;

          if (niv[Tx]==niv[Ty])
               niv[Ty]++;
     }

}

int main()
{
     freopen ("disjoint.in","r",stdin);
     freopen ("disjoint.out","w",stdout);
     scanf ("%d %d",&n,&m);

     for (int i=1;i<=n;i++)
          tata[i]=i;

     for (int i=0;i<m;i++)
     {
          scanf ("%d %d %d",&cod,&x,&y);
          if (cod==2)
          {
               Tx=rad(x);
               Ty=rad(y);
               printf("%s\n",((Tx==Ty)?"DA":"NU"));
          }
          else
               rez();
     }
     return 0;
}