Problem p03078 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
// #include <boost/multiprecision/cpp_int.hpp>

const double EPS = (1e-10);

using namespace std;
using Int = long long;
// using namespace boost::multiprecision;

const Int MOD = 1000000007;

Int mod_pow(Int x, Int n) {
  Int res = 1;
  while (n > 0) {
    if (n & 1)
      res = (res * x) % MOD; // ビット演算(最下位ビットが1のとき)
    x = (x * x) % MOD;
    n >>= 1; // 右シフト(n = n >> 1)
  }
  return res;
}

// 最大公約数
template <typename T> T gcd(T a, T b) { return b != 0 ? gcd(b, a % b) : a; }

// 最小公倍数
template <typename T> T lcm(T a, T b) { return a * b / gcd(a, b); }

long long ABC[3][1001];
vector<long long> AB_best;
vector<long long> ans;

int main() {
  int xyzk[4];
  for (int i = 0; i < 4; i++) {
    cin >> xyzk[i];
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < xyzk[i]; j++) {
      cin >> ABC[i][j];
    }
  }
  AB_best = vector<long long>(xyzk[0] * xyzk[1]);
  int cnt = 0;
  for (int i = 0; i < xyzk[0]; i++) {
    for (int j = 0; j < xyzk[1]; j++) {
      AB_best[cnt++] = ABC[0][i] + ABC[1][j];
    }
  }
  sort(AB_best.begin(), AB_best.end(), greater<long long>());
  cnt = 0;
  ans = vector<long long>(max(3000, xyzk[0] * xyzk[1]) * xyzk[2]);
  for (int i = 0; i < AB_best.size() && i < 3000; i++) {
    for (int j = 0; j < xyzk[2]; j++) {
      ans[cnt++] = AB_best[i] + ABC[2][j];
    }
  }
  sort(ans.begin(), ans.end(), greater<long long>());
  for (int i = 0; i < xyzk[3]; i++) {
    cout << ans[i] << endl;
  }
  return 0;
}


Fixed submission:
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
// #include <boost/multiprecision/cpp_int.hpp>

const double EPS = (1e-10);

using namespace std;
using Int = long long;
// using namespace boost::multiprecision;

const Int MOD = 1000000007;

Int mod_pow(Int x, Int n) {
  Int res = 1;
  while (n > 0) {
    if (n & 1)
      res = (res * x) % MOD; // ビット演算(最下位ビットが1のとき)
    x = (x * x) % MOD;
    n >>= 1; // 右シフト(n = n >> 1)
  }
  return res;
}

// 最大公約数
template <typename T> T gcd(T a, T b) { return b != 0 ? gcd(b, a % b) : a; }

// 最小公倍数
template <typename T> T lcm(T a, T b) { return a * b / gcd(a, b); }

long long ABC[3][1001];
vector<long long> AB_best;
vector<long long> ans;

int main() {
  int xyzk[4];
  for (int i = 0; i < 4; i++) {
    cin >> xyzk[i];
  }
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < xyzk[i]; j++) {
      cin >> ABC[i][j];
    }
  }
  AB_best = vector<long long>(xyzk[0] * xyzk[1]);
  int cnt = 0;
  for (int i = 0; i < xyzk[0]; i++) {
    for (int j = 0; j < xyzk[1]; j++) {
      AB_best[cnt++] = ABC[0][i] + ABC[1][j];
    }
  }
  sort(AB_best.begin(), AB_best.end(), greater<long long>());
  cnt = 0;
  ans = vector<long long>(3000 * xyzk[2]);
  for (int i = 0; i < AB_best.size() && i < 3000; i++) {
    for (int j = 0; j < xyzk[2]; j++) {
      ans[cnt++] = AB_best[i] + ABC[2][j];
    }
  }
  sort(ans.begin(), ans.end(), greater<long long>());
  for (int i = 0; i < xyzk[3]; i++) {
    cout << ans[i] << endl;
  }
  return 0;
}