Problem p03078 (C++)

Buggy submission (status: Runtime Error):
#define _CRT_SECURE_NO_WARNINGS

/* include ***********************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* define *************************/
// for
#define REP(i, n) for (int i = 0, i##_len = (int)(n); i < i##_len; i++)
#define REPS(i, n) for (int i = 1, i##_len = (int)(n); i <= i##_len; i++)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define RREPS(i, n) for (int i = (int)(n); i > 0; i--)
#define FOR(i, s, n)                                                           \
  for (int i = (int)(s), i##_len = (int)(n); i < i##_len; i++)
#define RFOR(i, s, n)                                                          \
  for (int i = (int)(s)-1, i##_len = (int)(n); i >= i##_len; i--)

// printf
#define PRINTD(d) printf("%d\n", (d))
#define PRINTL(d) printf("%lld\n", (d))

// memset
#define m0(s) memset(s, 0, sizeof(s))
#define ml(s) memset(s, 63, sizeof(s))
#define fill(s, c) memset(s, c, sizeof(s))

#define INF 1e9
#define MOD 1000000007

typedef long long ll;
typedef unsigned long long ull;

int diff[4][2] = {
    {0, -1},
    {-1, 0},
    {1, 0},
    {0, 1},
};
// 今回の変数
ll d[1000000];
ll e[1000000];

int Min(int a, int b) { return (a) < (b) ? (a) : (b); }
int Max(int a, int b) { return (a) > (b) ? (a) : (b); }
ll Minl(ll a, ll b) { return (a) < (b) ? (a) : (b); }
ll Maxl(ll a, ll b) { return (a) > (b) ? (a) : (b); }
void Swap(int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
void hSwap(ll x[], int i, int j) {
  ll temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}
void ShowData(ll x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%lld  ", x[i]);
  printf("\n");
}
void QSort(ll x[], int left, int right, int n) {
  int i, j; // 左端,右端
  ll pivot; // 軸

  i = left;
  j = right;
  pivot = x[(left + right) / 2];

  while (1) {
    if (n > 0) { // n>0なら昇順、n<=0なら降順
      while ((x[i] < pivot) && (i <= right))
        i++; // 軸値より大きい要素
      while ((pivot < x[j]) && (i <= right))
        j--; // 軸値より小さい要素
    } else {
      while ((x[i] > pivot) && (i <= right))
        i++; // 軸値より小さい要素
      while ((pivot > x[j]) && (i <= right))
        j--; // 軸値より大きい要素
    }
    if (i >= j)
      break;
    hSwap(x, i, j);
    i++;
    j--;
  }
  // ShowData(x, left, right);

  if (left < i - 1)
    QSort(x, left, i - 1, n);
  if (j + 1 < right)
    QSort(x, j + 1, right, n);
}

int main() {
  int x, y, z, k;
  ll a[1000], b[1000], c[1000];
  scanf("%d%d%d%d", &x, &y, &z, &k);
  REP(i, x) { scanf("%lld", &a[i]); }
  REP(i, y) { scanf("%lld", &b[i]); }
  REP(i, z) { scanf("%lld", &c[i]); }
  int cnt = 0;
  REP(i, x) {
    REP(j, y) { d[cnt++] = a[i] + b[j]; }
  }
  cnt = 0;
  QSort(d, 0, x * y - 1, 0);
  REP(i, Min(k, x * y)) {
    REP(j, z) { e[cnt++] = d[i] + c[j]; }
  }
  QSort(e, 0, Min(k, x * y) * z - 1, 0);
  REP(i, k) { PRINTL(e[i]); }
}

Fixed submission:
#define _CRT_SECURE_NO_WARNINGS

/* include ***********************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* define *************************/
// for
#define REP(i, n) for (int i = 0, i##_len = (int)(n); i < i##_len; i++)
#define REPS(i, n) for (int i = 1, i##_len = (int)(n); i <= i##_len; i++)
#define RREP(i, n) for (int i = (int)(n)-1; i >= 0; i--)
#define RREPS(i, n) for (int i = (int)(n); i > 0; i--)
#define FOR(i, s, n)                                                           \
  for (int i = (int)(s), i##_len = (int)(n); i < i##_len; i++)
#define RFOR(i, s, n)                                                          \
  for (int i = (int)(s)-1, i##_len = (int)(n); i >= i##_len; i--)

// printf
#define PRINTD(d) printf("%d\n", (d))
#define PRINTL(d) printf("%lld\n", (d))

// memset
#define m0(s) memset(s, 0, sizeof(s))
#define ml(s) memset(s, 63, sizeof(s))
#define fill(s, c) memset(s, c, sizeof(s))

#define INF 1e9
#define MOD 1000000007

typedef long long ll;
typedef unsigned long long ull;

int diff[4][2] = {
    {0, -1},
    {-1, 0},
    {1, 0},
    {0, 1},
};
// 今回の変数
ll d[1000000];
ll e[3000000];

int Min(int a, int b) { return (a) < (b) ? (a) : (b); }
int Max(int a, int b) { return (a) > (b) ? (a) : (b); }
ll Minl(ll a, ll b) { return (a) < (b) ? (a) : (b); }
ll Maxl(ll a, ll b) { return (a) > (b) ? (a) : (b); }
void Swap(int *a, int *b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
void hSwap(ll x[], int i, int j) {
  ll temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}
void ShowData(ll x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%lld  ", x[i]);
  printf("\n");
}
void QSort(ll x[], int left, int right, int n) {
  int i, j; // 左端,右端
  ll pivot; // 軸

  i = left;
  j = right;
  pivot = x[(left + right) / 2];

  while (1) {
    if (n > 0) { // n>0なら昇順、n<=0なら降順
      while ((x[i] < pivot) && (i <= right))
        i++; // 軸値より大きい要素
      while ((pivot < x[j]) && (i <= right))
        j--; // 軸値より小さい要素
    } else {
      while ((x[i] > pivot) && (i <= right))
        i++; // 軸値より小さい要素
      while ((pivot > x[j]) && (i <= right))
        j--; // 軸値より大きい要素
    }
    if (i >= j)
      break;
    hSwap(x, i, j);
    i++;
    j--;
  }
  // ShowData(x, left, right);

  if (left < i - 1)
    QSort(x, left, i - 1, n);
  if (j + 1 < right)
    QSort(x, j + 1, right, n);
}

int main() {
  int x, y, z, k;
  ll a[1000], b[1000], c[1000];
  scanf("%d%d%d%d", &x, &y, &z, &k);
  REP(i, x) { scanf("%lld", &a[i]); }
  REP(i, y) { scanf("%lld", &b[i]); }
  REP(i, z) { scanf("%lld", &c[i]); }
  int cnt = 0;
  REP(i, x) {
    REP(j, y) { d[cnt++] = a[i] + b[j]; }
  }
  cnt = 0;
  QSort(d, 0, x * y - 1, 0);
  REP(i, Min(k, x * y)) {
    REP(j, z) { e[cnt++] = d[i] + c[j]; }
  }
  QSort(e, 0, Min(k, x * y) * z - 1, 0);
  REP(i, k) { PRINTL(e[i]); }
}