Cod sursa(job #2285390)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 18 noiembrie 2018 15:44:43
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

const int NMAX = 100005;

int N, M;

int s[NMAX];
int r[NMAX];

void init() {
   for (int i = 0; i < N; ++i) {
      s[i] = i;
      r[i] = 0;
   }
}

int find(int x) {
   if (x != s[x]) {
      s[x] = find(s[x]);
   }
   return s[x];
}

void u(int x, int y) {
   int rx = find(x);
   int ry = find(y);
   if (rx == ry) {
      return;
   }

   if (r[rx] < r[ry]) {
      int aux = rx;
      rx = ry;
      ry = aux;
   }

   s[ry] = s[rx];

   if (r[rx] == r[ry]) {
      r[rx] += 1;
   }
}

bool is_same(int x, int y) {
   return find(x) == find(y);
}

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

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

   init();

   for (int i = 0; i < M; ++i) {
      int t, x, y;
      scanf("%d %d %d", &t, &x, &y);
      --x; --y;
      if (t == 1) {
         u(x, y);
      } else {
         bool ok = is_same(x, y);
         if (!ok) {
            printf("NU\n");
         } else {
            printf("DA\n");
         }
      }
   }

   fclose(stdin);
   fclose(stdout);
   return 0;
}