Cod sursa(job #2029207)

Utilizator stoianmihailStoian Mihail stoianmihail Data 29 septembrie 2017 17:40:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

#define MAX_N 100000

int N, M;
int boss[MAX_N + 1];
const char *ans[2] = {"NU", "DA"};

void init() {
  int u;
  for (u = 1; u <= N; u++) {
    boss[u] = u;
  }
}

int find(int u) {
  int r = u, tmp;
  while (r != boss[r]) {
    r = boss[r];
  }
  while (u != r) {
    tmp = boss[u];
    boss[u] = r;
    u = tmp;
  }
  return r;
}

void unify(int u, int v) {
  boss[find(v)] = find(u);
}

int main(void) {
  int i, task, a, b;
  FILE *f = fopen("disjoint.in", "r");
  freopen("disjoint.out", "w", stdout);

  fscanf(f, "%d %d", &N, &M);
  init();
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d %d", &task, &a, &b);
    if (task == 1) {
      unify(a, b);
    } else {
      fprintf(stdout, "%s\n", ans[find(a) == find(b)]);
    }
  }
  fclose(f);
  fclose(stdout);
  return 0;
}