Problem p02365 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using Int = int64_t;
using UInt = uint64_t;
using C = std::complex<double>;
#define rep(i, n) for (Int i = 0; i < (Int)(n); ++i)
#define guard(x)                                                               \
  if (not(x))                                                                  \
    continue;
#ifndef LOCAL_
#define fprintf                                                                \
  if (false)                                                                   \
  fprintf
#endif

#define debug() fprintf(stderr, "#%d\n", __LINE__);

template <typename T>
using RQ = std::priority_queue<T, std::vector<T>, std::greater<T>>;

struct Tree {
  Tree(Int n) : ps(n, -1) {}
  std::vector<Int> ps;
  Int root(Int x) {
    if (ps[x] == -1)
      return x;
    return ps[x] = root(ps[x]);
  }
  void connect(Int parent, Int child) { ps[root(child)] = root(parent); }
};

int main() {
  Int v, e, r;
  std::cin >> v >> e >> r;
  std::vector<Int> ss(e), ts(e), ws(e);
  rep(i, e) std::cin >> ss[i] >> ts[i] >> ws[i];
  std::vector<RQ<std::pair<Int, Int>>> qs(v);
  std::vector<Int> os(v);
  rep(i, e) {
    Int s = ss[i], t = ts[i], w = ws[i];
    qs[t].emplace(w, s);
  }
  std::vector<Int> xs(v);
  xs[r] = 2;
  Tree tree(v);
  bool fail = false;
  Int res = 0;
  rep(i, v) {
    fprintf(stderr, "i = %ld\n", i);
    Int a = tree.root(i);
    assert(xs[a] == 0 or xs[a] == 2);
    guard(xs[a] == 0);
    std::vector<std::pair<Int, Int>> ps(v); // p->i (cost, p)
    std::vector<Int> ys;
    while (xs[a] != 2) {
      debug();
      ys.emplace_back(a);
      xs[a] = 1;
      if (qs[a].empty()) {
        fprintf(stderr, "fail\n");
        fail = true;
        break;
      }
      Int w, p;
      do {
        std::tie(w, p) = qs[a].top();
        qs[a].pop();
      } while (tree.root(a) == tree.root(p));
      w += os[a];
      p = tree.root(p);
      ps[a] = std::make_pair(w, p);
      res += w;
      fprintf(stderr, "res += %ld, a = %ld, p = %ld\n", w, a, p);
      if (xs[p] != 1) {
        a = p;
      } else {
        Int nr = a;
        Int b = a;
        do {
          fprintf(stderr, "b = %ld\n", b);
          if (qs[nr].size() < qs[b].size())
            nr = b;
          b = ps[b].second;
          debug();
        } while (b != a);
        fprintf(stderr, "new root = %ld\n", nr);
        fprintf(stderr, "offset of new root : %ld -> %ld\n", os[nr],
                os[nr] - ps[nr].first);
        os[nr] -= ps[nr].first;
        b = a;
        do {
          debug();
          if (nr != b) {
            tree.connect(nr, b);
            fprintf(stderr, "connect : %ld <- %ld\n", nr, b);
            while (not qs[b].empty()) {
              Int w2, p2;
              std::tie(w2, p2) = qs[b].top();
              qs[b].pop();
              w2 += os[b] - ps[b].first;
              p2 = tree.root(p2);
              Int nw = w2 - os[nr];
              fprintf(stderr, "w2 = %ld\n", w2);
              fprintf(stderr, "new edge : %ld -> %ld, w = %ld(prev=%ld)\n", p2,
                      b, nw, w2);
              qs[nr].emplace(nw, p2);
              debug();
            }
          }
          b = ps[b].second;
        } while (b != a);
        //    b = tree.root(ps[b].second);
        // } while( b != tree.root(a) );
        a = nr;
      }
    }
    if (fail)
      break;
    for (Int y : ys) {
      xs[y] = 2;
    }
  }
  printf("%ld\n", res);
}


Fixed submission:
#include <bits/stdc++.h>
using Int = int64_t;
using UInt = uint64_t;
using C = std::complex<double>;
#define rep(i, n) for (Int i = 0; i < (Int)(n); ++i)
#define guard(x)                                                               \
  if (not(x))                                                                  \
    continue;
#ifndef LOCAL_
#define fprintf                                                                \
  if (false)                                                                   \
  fprintf
#endif

#define debug() fprintf(stderr, "#%d\n", __LINE__);

template <typename T>
using RQ = std::priority_queue<T, std::vector<T>, std::greater<T>>;

struct Tree {
  Tree(Int n) : ps(n, -1) {}
  std::vector<Int> ps;
  Int root(Int x) {
    if (ps[x] == -1)
      return x;
    return ps[x] = root(ps[x]);
  }
  void connect(Int parent, Int child) {
    parent = root(parent), child = root(child);
    if (parent == child)
      return;
    ps[root(child)] = root(parent);
  }
};

int main() {
  Int v, e, r;
  std::cin >> v >> e >> r;
  std::vector<Int> ss(e), ts(e), ws(e);
  rep(i, e) std::cin >> ss[i] >> ts[i] >> ws[i];
  std::vector<RQ<std::pair<Int, Int>>> qs(v);
  std::vector<Int> os(v);
  rep(i, e) {
    Int s = ss[i], t = ts[i], w = ws[i];
    qs[t].emplace(w, s);
  }
  std::vector<Int> xs(v);
  xs[r] = 2;
  Tree tree(v);
  bool fail = false;
  Int res = 0;
  rep(i, v) {
    fprintf(stderr, "i = %ld\n", i);
    Int a = tree.root(i);
    assert(xs[a] == 0 or xs[a] == 2);
    guard(xs[a] == 0);
    std::vector<std::pair<Int, Int>> ps(v); // p->i (cost, p)
    std::vector<Int> ys;
    while (xs[a] != 2) {
      debug();
      ys.emplace_back(a);
      xs[a] = 1;
      if (qs[a].empty()) {
        fprintf(stderr, "fail\n");
        fail = true;
        break;
      }
      Int w, p;
      do {
        std::tie(w, p) = qs[a].top();
        qs[a].pop();
      } while (tree.root(a) == tree.root(p));
      w += os[a];
      p = tree.root(p);
      ps[a] = std::make_pair(w, p);
      res += w;
      fprintf(stderr, "res += %ld, a = %ld, p = %ld\n", w, a, p);
      if (xs[p] != 1) {
        a = p;
      } else {
        Int nr = a;
        Int b = a;
        do {
          fprintf(stderr, "b = %ld\n", b);
          if (qs[nr].size() < qs[b].size())
            nr = b;
          b = ps[b].second;
          debug();
        } while (b != a);
        fprintf(stderr, "new root = %ld\n", nr);
        fprintf(stderr, "offset of new root : %ld -> %ld\n", os[nr],
                os[nr] - ps[nr].first);
        os[nr] -= ps[nr].first;
        b = a;
        do {
          debug();
          if (nr != b) {
            tree.connect(nr, b);
            fprintf(stderr, "connect : %ld <- %ld\n", nr, b);
            while (not qs[b].empty()) {
              Int w2, p2;
              std::tie(w2, p2) = qs[b].top();
              qs[b].pop();
              w2 += os[b] - ps[b].first;
              p2 = tree.root(p2);
              Int nw = w2 - os[nr];
              fprintf(stderr, "w2 = %ld\n", w2);
              fprintf(stderr, "new edge : %ld -> %ld, w = %ld(prev=%ld)\n", p2,
                      b, nw, w2);
              qs[nr].emplace(nw, p2);
              debug();
            }
          }
          b = ps[b].second;
        } while (b != a);
        //    b = tree.root(ps[b].second);
        // } while( b != tree.root(a) );
        a = nr;
      }
    }
    if (fail)
      break;
    for (Int y : ys) {
      xs[y] = 2;
    }
  }
  printf("%ld\n", res);
}