Problem p02610 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using Int = long long; // clang-format off
#define REP_(i, a_, b_, a, b, ...) for (Int i = (a), lim##i = (b); i < lim##i; i++)
#define REP(i, ...) REP_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__)
#define ALL(v) std::begin(v), std::end(v)
struct SetupIO { SetupIO() { std::cin.tie(nullptr), std::ios::sync_with_stdio(false), std::cout << std::fixed << std::setprecision(13); } } setup_io;
#ifndef dump
#define dump(...)
#endif // clang-format on

/**
 *    author:  knshnb
 *    created: Tue Jul 21 18:31:19 JST 2020
 **/

void solve() {
  Int n;
  std::cin >> n;
  std::vector<std::vector<Int>> bl(n), br(n);
  Int ans = 0;
  REP(i, n) {
    Int k, l, r;
    std::cin >> k >> l >> r, k--;
    ans += std::min(l, r);
    if (l > r) {
      bl[k].push_back(l - r);
    } else {
      if (n - 2 - k >= 0)
        br[n - 2 - k].push_back(r - l);
    }
  }
  for (auto &v : {bl, br}) {
    std::priority_queue<Int, std::vector<Int>, std::greater<Int>> pq;
    REP(i, n) {
      for (Int x : v[i])
        pq.push(x);
      while (pq.size() > i + 1)
        pq.pop();
    }
    while (pq.size())
      ans += pq.top(), pq.pop();
  }
  std::cout << ans << "\\n";
}
signed main() {
  Int T;
  std::cin >> T;
  while (T--)
    solve();
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using Int = long long; // clang-format off
#define REP_(i, a_, b_, a, b, ...) for (Int i = (a), lim##i = (b); i < lim##i; i++)
#define REP(i, ...) REP_(i, __VA_ARGS__, __VA_ARGS__, 0, __VA_ARGS__)
struct SetupIO { SetupIO() { std::cin.tie(nullptr), std::ios::sync_with_stdio(false), std::cout << std::fixed << std::setprecision(13); } } setup_io;
#ifndef dump
#define dump(...)
#endif // clang-format on

/**
 *    author:  knshnb
 *    created: Sat Jul 11 22:00:35 JST 2020
 **/

/// @docs src/DataStructure/SegmentTree.md
template <class T, class F> struct SegmentTree {
  const F op;
  const T e;
  SegmentTree(F op_, T e_) : op(op_), e(e_) {}
  int n;
  std::vector<T> t;
  void set_by_identity(int n_) {
    n = n_;
    t.clear(), t.resize(2 * n, e);
  }
  void set_by_vector(const std::vector<T> &a) {
    n = a.size();
    t.clear(), t.resize(2 * n, e);
    for (int i = 0; i < n; i++)
      t[i + n] = a[i];
    build();
  }
  void build() {
    for (int i = n - 1; i; --i)
      t[i] = op(t[2 * i], t[2 * i + 1]);
  }
  T &operator[](int i) { return t[i + n]; }
  // [l, r)
  T query(int l, int r) const {
    assert(0 <= l && l <= r && r <= n);
    T resl = e, resr = e;
    for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
      if (l & 1)
        resl = op(resl, t[l++]);
      if (r & 1)
        resr = op(t[--r], resr);
    }
    return op(resl, resr);
  }
  // i番目をxに変更
  void update(int i, const T &x) {
    assert(0 <= i && i < n);
    t[i += n] = x;
    while (i >>= 1)
      t[i] = op(t[2 * i], t[2 * i + 1]);
  }
  // i番目にxを作用 (a[i] = op(a[i], x))
  void operate(int i, const T &x) {
    assert(0 <= i && i < n);
    i += n;
    t[i] = op(t[i], x);
    while (i >>= 1)
      t[i] = op(t[2 * i], t[2 * i + 1]);
  }
  friend std::string to_string(const SegmentTree<T, F> &seg) {
    return to_string(std::vector<T>(seg.t.begin() + seg.n, seg.t.end()));
  }
};
template <class T, class F> auto make_segment_tree(F op, T e) {
  return SegmentTree<T, F>(op, e);
}

void solve() {
  Int n;
  std::cin >> n;
  Int ans = 0;
  std::vector<Int> K(n), dif(n);
  REP(i, n) {
    Int l, r;
    std::cin >> K[i] >> l >> r, K[i]--;
    ans += r;
    dif[i] = l - r;
  }
  std::vector<Int> ord(n);
  std::iota(ord.begin(), ord.end(), 0LL);
  std::sort(ord.begin(), ord.end(),
            [&](Int i, Int j) { return dif[i] > dif[j]; });
  dump(dif, ord);
  auto p = make_segment_tree<Int>(std::plus<Int>(), 0);
  p.set_by_identity(n);
  auto q = make_segment_tree<Int>(std::plus<Int>(), 0);
  q.set_by_identity(n);
  std::vector<bool> l(n), r(n + 1);
  r[n] = true;
  for (Int k : ord) {
    Int i = ord[k];
    auto set_L = [&]() {
      assert(p.query(0, K[i] + 1) < K[i] + 1);
      p.operate(K[i], 1);
      ans += dif[i];
      if (p.query(0, K[i] + 1) == K[i] + 1) {
        for (Int j = K[i]; j >= 0; j--) {
          if (l[j])
            break;
          l[j] = true;
        }
      }
    };
    auto set_R = [&]() {
      assert(q.query(K[i] + 1, n) < n - 1 - K[i]);
      q.operate(K[i] + 1, 1);
      if (q.query(K[i] + 1, n) == n - 1 - K[i]) {
        REP(j, K[i] + 1, n) {
          if (r[j])
            break;
          r[j] = true;
        }
      }
    };
    // if (p.query(0, K[i] + 1) >= K[i] + 1) {
    if (l[K[i]]) {
      set_R();
      // } else if (q.query(K[i] + 1, n) >= n - 1 - K[i]) {
    } else if (r[K[i] + 1]) {
      set_L();
    } else if (dif[i] < 0) {
      set_R();
    } else {
      set_L();
    }
  }
  std::cout << ans << "\\n";
}
signed main() {
  Int T;
  std::cin >> T;
  while (T--)
    solve();
}