Problem p03078 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

int main() {
  int X, Y, Z, K; // X種Y種Z種から一つずつ買う，K:選び方
  cin >> X >> Y >> Z >> K;

  vector<long> A, B, C; // 価格
  long a, b, c;
  for (int i = 0; i < X; i++) {
    cin >> a;
    A.push_back(a);
  }
  for (int j = 0; j < Y; j++) {
    cin >> b;
    B.push_back(b);
  }
  for (int k = 0; k < Z; k++) {
    cin >> c;
    C.push_back(c);
  }

  // 降順ソート
  sort(A.begin(), A.end(), greater<long>());
  sort(B.begin(), B.end(), greater<long>());
  sort(C.begin(), C.end(), greater<long>());

  tuple<long, int, int, int> d;                 // (delicious_score, i, j, k)
  priority_queue<tuple<long, int, int, int>> q; // scoreの最大値管理用コンテナ
  set<tuple<long, int, int, int>>
      s; // 重複したものをq.pushしないための検索用コンテナ
  int i = 0;
  int j = 0;
  int k = 0;

  while (K > 0) {
    // 次に一番美味しいケーキの組み合わせ
    if (i + 1 < X) {
      d = make_tuple(A[i + 1] + B[j] + C[k], i + 1, j, k);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    if (j + 1 < Y) {
      d = make_tuple(A[i] + B[j + 1] + C[k], i, j + 1, k);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    if (k + 1 < Z) {
      d = make_tuple(A[i] + B[j] + C[k + 1], i, j, k + 1);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    auto qtop = q.top();
    i = get<1>(qtop);
    j = get<2>(qtop);
    k = get<3>(qtop);
    cout << get<0>(qtop) << endl;
    q.pop();
    K--;
  }

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

int main() {
  int X, Y, Z, K; // X種Y種Z種から一つずつ買う，K:選び方
  cin >> X >> Y >> Z >> K;

  vector<long> A, B, C; // 価格
  long a, b, c;
  for (int i = 0; i < X; i++) {
    cin >> a;
    A.push_back(a);
  }
  for (int j = 0; j < Y; j++) {
    cin >> b;
    B.push_back(b);
  }
  for (int k = 0; k < Z; k++) {
    cin >> c;
    C.push_back(c);
  }

  // 降順ソート
  sort(A.begin(), A.end(), greater<long>());
  sort(B.begin(), B.end(), greater<long>());
  sort(C.begin(), C.end(), greater<long>());

  tuple<long, int, int, int> d;                 // (delicious_score, i, j, k)
  priority_queue<tuple<long, int, int, int>> q; // scoreの最大値管理用コンテナ
  set<tuple<long, int, int, int>>
      s; // 重複したものをq.pushしないための検索用コンテナ
  int i = 0;
  int j = 0;
  int k = 0;

  // 一番美味しいケーキの組み合わせ
  d = make_tuple(A[i] + B[j] + C[k], i, j, k);
  if (!s.count(d)) {
    q.push(d);
    s.insert(d);
  }
  auto qtop = q.top();
  i = get<1>(qtop);
  j = get<2>(qtop);
  k = get<3>(qtop);
  cout << get<0>(qtop) << endl;
  q.pop();
  K--;

  while (K > 0) {
    // 次に一番美味しいケーキの組み合わせ
    if (i + 1 < X) {
      d = make_tuple(A[i + 1] + B[j] + C[k], i + 1, j, k);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    if (j + 1 < Y) {
      d = make_tuple(A[i] + B[j + 1] + C[k], i, j + 1, k);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    if (k + 1 < Z) {
      d = make_tuple(A[i] + B[j] + C[k + 1], i, j, k + 1);
      if (!s.count(d)) {
        q.push(d);
        s.insert(d);
      }
    }
    auto qtop = q.top();
    i = get<1>(qtop);
    j = get<2>(qtop);
    k = get<3>(qtop);
    cout << get<0>(qtop) << endl;
    q.pop();
    K--;
  }

  return 0;
}