Cod sursa(job #3312808)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 30 septembrie 2025 00:59:16
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

const char iname[] = "disjoint.in";
const char oname[] = "disjoint.out";

class Dsu {
  vector<int> p;
  vector<int> r;

 public:
  Dsu(int n) : p(vector<int>(n)), r(vector<int>(n)) {
    iota(p.begin(), p.end(), 0);
  }

  int get(int u) {
    if (u == p[u]) {
      return u;
    }
    return (p[u] = get(p[u]));
  }

  bool put(int u, int v) {
    int U = get(u);
    int V = get(v);
    if (U == V) {
      return false;
    }
    if (r[U] <= r[V]) {
      p[U] = V;
      if (r[u] == r[v]) {
        ++r[v];
      }
    } else {
      p[V] = U;
    }
    return true;
  }
};

int main() {
#ifndef LOCAL
  freopen(iname, "r", stdin);
  freopen(oname, "w", stdout);
#endif
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  int m;
  cin >> n >> m;
  Dsu dsu(n);
  for (; m--;) {
    int o;
    int u;
    int v;
    cin >> o >> u >> v;
    --o;
    --u;
    --v;
    if (o) {
      cout << (dsu.get(u) == dsu.get(v) ? "DA" : "NU") << endl;
    } else {
      dsu.put(u, v);
    }
  }
  return 0;
}