Cod sursa(job #2779655)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 octombrie 2021 17:14:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

std::ifstream in("disjoint.in");
std::ofstream out("disjoint.out");

class DSUROLLBACK {
private:
  class Event {
  public:
    int u, dadU, v, rankV;
    Event(int _u, int _dadU, int _v, int _rankV) {
      u = _u;
      v = _v;
      dadU = _dadU;
      rankV = _rankV;
    }
    Event() {}
  };
  int n;
  std::stack<Event> events;
  std::vector<int> r, dad;
public:
  DSUROLLBACK(int _n) {
    n = _n;
    r.resize(n + 1, 1);
    dad.resize(n + 1);
    std::iota(dad.begin(), dad.end(), 0);
  }
  int find(int u) {
    if (u == dad[u]) {
      return u;
    }
    return find(dad[u]);
  }
  void join(int u, int v) {
    int a = find(u), b = find(v);
    if (a == b) {
      return;
    }
    if (r[a] < r[b]) {
      std::swap(a, b);
    }
    events.push(Event(b, dad[b], a, r[a]));
    dad[b] = a;
    r[a] += r[b];
  }
  bool rollback() {
    if (!(int)events.size()) {
      return false;
    }
    Event last = events.top();
    events.pop();
    int u = last.u, v = last.v, dadU = last.dadU, rankV = last.rankV;
    dad[u] = dadU;
    r[v] = rankV;
    return true;
  }
};

int n, m;

int main() {
  in >> n >> m;
  DSUROLLBACK ds(n);
  for (int i = 1; i <= m; i++) {
    int op, x, y;
    in >> op >> x >> y;
    if (op == 1) {
      ds.join(x, y);
    } else {
      x = ds.find(x);
      y = ds.find(y);
      out << ((x == y) ? "DA\n" : "NU\n");
    }
  }
  return 0;
}