Cod sursa(job #3029922)

Utilizator highonrocketfuelOverweight Raccoon highonrocketfuel Data 17 martie 2023 11:37:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <iostream>

using namespace std;

const int NMAX = 1e5;

int djs[1 + NMAX];
int djs_height[1 + NMAX];

int djs_root(int a) {
  if (djs[a] == a) {
    return a;
  }

  djs[a] = djs_root(djs[a]);
  return djs[a];
}

void djs_join(int a, int b) {
  a = djs_root(a);
  b = djs_root(b);

  if (a == b) {
    return;
  }

  if (djs_height[a] < djs_height[b]) {
    djs[a] = b;
  } else if (djs_height[a] > djs_height[b]) {
    djs[b] = a;
  } else {
    djs[a] = b;
    ++djs_height[b];
  }
}

int main() {
  ifstream r("disjoint.in");
  ofstream w("disjoint.out");

  int n, m;
  r >> n >> m;

  for (int i = 1; i <= n; ++i) {
    djs[i] = i;
    djs_height[i] = 1;
  }

  while (m--) {
    int type, a, b;
    r >> type >> a >> b;

    if (type == 1) {
      djs_join(a, b);
      continue;
    }

    int set_a = djs_root(a);
    int set_b = djs_root(b);

    w << (set_a == set_b ? "DA" : "NU") << '\n';
  }

  return 0;
}