Problem p03032 (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)(n)-1, i##_len = (int)(s); 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},
};
// 今回の変数

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 hSwap(int x[], int i, int j) {
  int temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}
void ShowData(int x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%d  ", x[i]);
  printf("\n");
}
void QSort(int x[], int left, int right, int n) {
  int i, j;  // 左端,右端
  int 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 ans = -1 * 1e9;

  int n, k;
  scanf("%d%d", &n, &k);

  int v[50];
  REP(i, n) scanf("%d", &v[i]);

  REP(i, n + 1) {
    if (i > k)
      break;
    REP(j, n + 1) {
      if (i + j > k)
        break;
      int left = i;
      int right = j;
      int back = k - left - right;
      int min[50];
      int num = 0;
      int cnt = 0;
      REP(m, 50) min[m] = 1e9;
      REP(m, left) {
        num += v[m];
        if (v[m] < 0) {
          min[cnt++] = v[m];
        }
      }
      REP(m, right) {
        num += v[n - 1 - m];
        if (v[n - 1 - m] < 0) {
          min[cnt++] = v[n - 1 - m];
        }
      }
      if (cnt > back) {
        QSort(min, 0, cnt - 1, 1);
      }
      REP(m, Min(cnt, back)) { num -= min[m]; }
      // printf("left:%d,right:%d,back:%d,:cnt:%d\n", left, right, back, cnt);
      ans = Max(ans, num);
      // PRINTD(ans);
      // puts("");
    }
  }
  PRINTD(ans);
}


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)(n)-1, i##_len = (int)(s); 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},
};
// 今回の変数

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 hSwap(int x[], int i, int j) {
  int temp;

  temp = x[i];
  x[i] = x[j];
  x[j] = temp;
}
void ShowData(int x[], int left, int right) {
  int i;
  for (i = left; i <= right; i++)
    printf("%d  ", x[i]);
  printf("\n");
}
void QSort(int x[], int left, int right, int n) {
  int i, j;  // 左端,右端
  int 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 ans = -1 * 1e9;

  int n, k;
  scanf("%d%d", &n, &k);

  int v[50];
  REP(i, n) scanf("%d", &v[i]);

  REP(i, n + 1) {
    if (i > k)
      break;
    REP(j, n + 1 - i) {
      if (i + j > k)
        break;
      int left = i;
      int right = j;
      int back = k - left - right;
      int min[50];
      int num = 0;
      int cnt = 0;
      REP(m, 50) min[m] = 1e9;
      REP(m, left) {
        num += v[m];
        if (v[m] < 0) {
          min[cnt++] = v[m];
        }
      }
      REP(m, right) {
        num += v[n - 1 - m];
        if (v[n - 1 - m] < 0) {
          min[cnt++] = v[n - 1 - m];
        }
      }
      if (cnt > back) {
        QSort(min, 0, cnt - 1, 1);
      }
      REP(m, Min(cnt, back)) { num -= min[m]; }
      // printf("left:%d,right:%d,back:%d,:cnt:%d\n", left, right, back, cnt);
      ans = Max(ans, num);
      // PRINTD(ans);
      // puts("");
    }
  }
  PRINTD(ans);
}