Cod sursa(job #1660735)

Utilizator AttyyKucsvan Attila Attyy Data 23 martie 2016 13:14:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

const int lim = 1 << 17;

int tata[lim], rang[lim];

void init()
{
   for(int i = 0; i < lim; ++i)
      tata[i] = i, rang[i] = 1;
}

int father(int x)
{
   if(x == tata[x])
      return x;
   return tata[x] = father(tata[x]);
}

void unite(int x , int y)
{
   int tx = father(x), ty = father(y);
   if(rang[tx] > rang[ty])
      tata[ty] = tx;
   else tata[tx] = ty;
   if(rang[tx] == rang[ty])
      ++rang[ty];
}

int main()
{
   freopen("disjoint.in", "r", stdin);
   freopen("disjoint.out", "w", stdout);

   init();
   int N, M;
   scanf("%d %d", &N, &M);

   while(M--)
   {
      int kind, x, y;
      scanf("%d%d%d", &kind, &x, &y);
      if(kind == 1)
         unite(x , y);
      else
         printf("%s\n", father(x) == father(y) ? "DA" : "NU");
   }
   return 0;
}