Cod sursa(job #1414426)

Utilizator robertstrecheStreche Robert robertstreche Data 2 aprilie 2015 16:45:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

#define NMAX 100005

using namespace std;

int n,query,x,y,type;
int nr[NMAX],tata[NMAX];

inline int boss(int nod)
{
    int rad=nod;
    while (rad!=tata[rad])
     rad=tata[rad];
    while (nod!=tata[nod])
    {
        tata[nod]=rad;
        nod=tata[nod];
    }
   return rad;
}
inline void reuneste(int poz1,int poz2)
{
    if (nr[poz1]<nr[poz2])
    {
        tata[poz2]=poz1;
        nr[poz1]+=nr[poz2];
    }
    else
    {
        tata[poz1]=poz2;
        nr[poz2]+=nr[poz1];
    }
}
int main()
{
    freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    scanf("%d %d",&n,&query);
    for (int i=1;i<=n;i++)
    {
        nr[i]=1;
        tata[i]=i;
    }
    for (int i=1;i<=query;i++)
    {
        scanf("%d %d %d",&type,&x,&y);
        if (type==1)
          reuneste(boss(x),boss(y));
        else
          printf(boss(x)==boss(y)?"DA\n":"NU\n");
    }

    fclose(stdin);
    fclose(stdout);
}