Problem p02727 (C++)

Buggy submission (status: Runtime Error):
#pragma GCC optimize("O3")
#pragma GCC target("avx")
#pragma GCC optimize("unroll-loops")
#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define DB double
#define ST string
#define BS bitset
#define VE vector
#define VL vector<LL>
#define VP vector<pair<LL, LL>>
#define VVL vector<vector<LL>>
// #define PQ priority_queue
#define PQS priority_queue<LL, vector<LL>, greater<LL>>
#define PB push_back
#define POB pop_back
#define PF push_front
#define POF pop_front
#define EB emplace_back
#define MP make_pair
#define TS to_string
#define TU to_ullong
#define FOR(i, a, n) for (i = a; i < n; i++)
#define rep(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define RALL(a) a.rbegin(), a.rend()
#define SORT(a) sort(ALL(a))
#define REV(a) reverse(ALL(a))
#define UB(a, n) *upper_bound(ALL(a), n)
#define LB(a, n) *lower_bound(ALL(a), n)
#define INF 1145141919810364364
#define PI 3.14159265358979
#define MOD 1000000007
// #define MOD 998244353
#define ERR 0.00000000000001
#define NUM 2000
#define FAST                                                                   \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false)

void Yn(LL a) {
  if (a)
    printf("Yes\n");
  else
    printf("No\n");
}
void YN(LL a) {
  if (a)
    printf("YES\n");
  else
    printf("NO\n");
}
LL pwmn(LL a, LL n) {
  LL ans = 1;
  while (ans < a)
    ans *= n;
  return ans;
}
LL GCD(LL a, LL b) {
  LL c = 1, tmp = max(a, b);
  b = min(a, b);
  a = tmp;
  while (c != 0) {
    c = a % b;
    a = b;
    b = c;
  }
  return a;
}
LL LCM(LL a, LL b) { return a * b / GCD(a, b); }
LL mod(LL a, LL m) {
  if (a < 0)
    return a % m + m;
  else
    return a % m;
}
LL DIV(LL a, LL d) {
  LL m = MOD, x = 1, y = 0, k;
  while (m) {
    k = d / m;
    d -= k * m;
    swap(m, d);
    x -= k * y;
    swap(x, y);
  }
  return mod(a * mod(x, MOD), MOD);
}
LL POW(LL a, LL n) {
  LL ans = 1;
  while (n > 0) {
    if (n & 1)
      ans = ans * a % MOD;
    a = a * a % MOD;
    n >>= 1;
  }
  return ans;
}
LL fact[NUM], finv[NUM], inv[NUM];
void comi() {
  LL i;
  fact[0] = fact[1] = 1;
  finv[0] = finv[1] = 1;
  inv[1] = 1;
  FOR(i, 2, NUM) {
    fact[i] = fact[i - 1] * i % MOD;
    inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
    finv[i] = finv[i - 1] * inv[i] % MOD;
  }
}
LL com(LL n, LL k) {
  if (n < k || n < 0 || k < 0)
    return 0;
  return fact[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
bool cmps(pair<LL, LL> a, pair<LL, LL> b) {
  if (a.second != b.second)
    return a.second < b.second;
  return a.first < b.first;
}

typedef struct {
  LL pid, pnum, rpid[NUM], cpid[NUM], que[NUM];
} PQ;
// ポインタ渡し、pid/pnum初期化 忘れずに
LL judge(LL a, LL b, PQ *pq) {
  if (pq->pnum < b || b == 1)
    return 0;
  return pq->cpid[pq->que[a]] > pq->cpid[pq->que[b]] ? 1 : 0;
}
void push(LL a, LL n, PQ *pq) {
  LL i = ++pq->pid, j = ++pq->pnum;
  pq->rpid[i] = n, pq->cpid[i] = a, pq->que[j] = i;
  while (judge(j / 2, j, pq))
    pq->que[j] = pq->que[j / 2], pq->que[j /= 2] = i;
}
LL pop(PQ *pq) {
  LL ans = pq->rpid[pq->que[1]], i = 1, j;
  LL n = pq->que[pq->pnum--];
  pq->que[1] = n;
  while (judge(i, j = i * 2 + judge(i * 2, i * 2 + 1, pq), pq))
    pq->que[i] = pq->que[j], pq->que[i = j] = n;
  return ans;
}

int main() {
  FAST;
  LL i, ans = 0, X, Y, A, B, C, pa, pb;
  cin >> X >> Y >> A >> B >> C;
  VL p(A), q(B), r(C);
  PQ a, b;
  a.pid = a.pnum = b.pid = b.pnum = 0;
  rep(i, A) cin >> p[i];
  rep(i, B) cin >> q[i];
  rep(i, C) cin >> r[i];
  SORT(p);
  SORT(q);
  SORT(r);
  REV(p);
  REV(q);
  REV(r);
  rep(i, X) {
    push(p[i], p[i], &a);
    ans += p[i];
  }
  rep(i, Y) {
    push(q[i], q[i], &b);
    ans += q[i];
  }
  rep(i, C) {
    pa = pop(&a);
    pb = pop(&b);
    if (pa <= pb && pa <= r[i]) {
      ans -= pa;
      ans += r[i];
      push(r[i], r[i], &a);
      push(pb, pb, &b);
    } else if (pb <= pa && pb <= r[i]) {
      ans -= pb;
      ans += r[i];
      push(r[i], r[i], &b);
      push(pa, pa, &a);
    } else
      break;
  }

  cout << ans << endl;
}


Fixed submission:
#pragma GCC optimize("O3")
#pragma GCC target("avx")
#pragma GCC optimize("unroll-loops")
#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define DB double
#define ST string
#define BS bitset
#define VE vector
#define VL vector<LL>
#define VP vector<pair<LL, LL>>
#define VVL vector<vector<LL>>
// #define PQ priority_queue
#define PQS priority_queue<LL, vector<LL>, greater<LL>>
#define PB push_back
#define POB pop_back
#define PF push_front
#define POF pop_front
#define EB emplace_back
#define MP make_pair
#define TS to_string
#define TU to_ullong
#define FOR(i, a, n) for (i = a; i < n; i++)
#define rep(i, n) FOR(i, 0, n)
#define ALL(a) a.begin(), a.end()
#define RALL(a) a.rbegin(), a.rend()
#define SORT(a) sort(ALL(a))
#define REV(a) reverse(ALL(a))
#define UB(a, n) *upper_bound(ALL(a), n)
#define LB(a, n) *lower_bound(ALL(a), n)
#define INF 1145141919810364364
#define PI 3.14159265358979
#define MOD 1000000007
// #define MOD 998244353
#define ERR 0.00000000000001
#define NUM 200010
#define FAST                                                                   \
  cin.tie(0);                                                                  \
  ios::sync_with_stdio(false)

void Yn(LL a) {
  if (a)
    printf("Yes\n");
  else
    printf("No\n");
}
void YN(LL a) {
  if (a)
    printf("YES\n");
  else
    printf("NO\n");
}
LL pwmn(LL a, LL n) {
  LL ans = 1;
  while (ans < a)
    ans *= n;
  return ans;
}
LL GCD(LL a, LL b) {
  LL c = 1, tmp = max(a, b);
  b = min(a, b);
  a = tmp;
  while (c != 0) {
    c = a % b;
    a = b;
    b = c;
  }
  return a;
}
LL LCM(LL a, LL b) { return a * b / GCD(a, b); }
LL mod(LL a, LL m) {
  if (a < 0)
    return a % m + m;
  else
    return a % m;
}
LL DIV(LL a, LL d) {
  LL m = MOD, x = 1, y = 0, k;
  while (m) {
    k = d / m;
    d -= k * m;
    swap(m, d);
    x -= k * y;
    swap(x, y);
  }
  return mod(a * mod(x, MOD), MOD);
}
LL POW(LL a, LL n) {
  LL ans = 1;
  while (n > 0) {
    if (n & 1)
      ans = ans * a % MOD;
    a = a * a % MOD;
    n >>= 1;
  }
  return ans;
}
LL fact[NUM], finv[NUM], inv[NUM];
void comi() {
  LL i;
  fact[0] = fact[1] = 1;
  finv[0] = finv[1] = 1;
  inv[1] = 1;
  FOR(i, 2, NUM) {
    fact[i] = fact[i - 1] * i % MOD;
    inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
    finv[i] = finv[i - 1] * inv[i] % MOD;
  }
}
LL com(LL n, LL k) {
  if (n < k || n < 0 || k < 0)
    return 0;
  return fact[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
bool cmps(pair<LL, LL> a, pair<LL, LL> b) {
  if (a.second != b.second)
    return a.second < b.second;
  return a.first < b.first;
}

typedef struct {
  LL pid, pnum, rpid[NUM], cpid[NUM], que[NUM];
} PQ;
// ポインタ渡し、pid/pnum初期化 忘れずに
LL judge(LL a, LL b, PQ *pq) {
  if (pq->pnum < b || b == 1)
    return 0;
  return pq->cpid[pq->que[a]] > pq->cpid[pq->que[b]] ? 1 : 0;
}
void push(LL a, LL n, PQ *pq) {
  LL i = ++pq->pid, j = ++pq->pnum;
  pq->rpid[i] = n, pq->cpid[i] = a, pq->que[j] = i;
  while (judge(j / 2, j, pq))
    pq->que[j] = pq->que[j / 2], pq->que[j /= 2] = i;
}
LL pop(PQ *pq) {
  LL ans = pq->rpid[pq->que[1]], i = 1, j;
  LL n = pq->que[pq->pnum--];
  pq->que[1] = n;
  while (judge(i, j = i * 2 + judge(i * 2, i * 2 + 1, pq), pq))
    pq->que[i] = pq->que[j], pq->que[i = j] = n;
  return ans;
}

int main() {
  FAST;
  LL i, ans = 0, X, Y, A, B, C, pa, pb;
  cin >> X >> Y >> A >> B >> C;
  VL p(A), q(B), r(C);
  PQ a, b;
  a.pid = a.pnum = b.pid = b.pnum = 0;
  rep(i, A) cin >> p[i];
  rep(i, B) cin >> q[i];
  rep(i, C) cin >> r[i];
  SORT(p);
  SORT(q);
  SORT(r);
  REV(p);
  REV(q);
  REV(r);
  rep(i, X) {
    push(p[i], p[i], &a);
    ans += p[i];
  }
  rep(i, Y) {
    push(q[i], q[i], &b);
    ans += q[i];
  }
  rep(i, C) {
    pa = pop(&a);
    pb = pop(&b);
    if (pa <= pb && pa <= r[i]) {
      ans -= pa;
      ans += r[i];
      push(r[i], r[i], &a);
      push(pb, pb, &b);
    } else if (pb <= pa && pb <= r[i]) {
      ans -= pb;
      ans += r[i];
      push(r[i], r[i], &b);
      push(pa, pa, &a);
    } else
      break;
  }

  cout << ans << endl;
}