Problem p02616 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef long double ld;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define init(a, i)                                                             \\
  for (int k = 0; k < (i); k++)                                                \\
  (a)[k] = 0
#define in(a, i)                                                               \\
  for (int k = 0; k < (i); k++)                                                \\
  cin >> (a)[k]
#define all(a) (a).begin(), (a).end()
#define el(a) (a).end() - (a).begin()
int main() {
  int n, k;
  cin >> n >> k;
  vector<ll> p, m;
  ll a[n];
  rep(i, n) {
    cin >> a[i];
    if (a[i] > 0)
      p.push_back(a[i]);
    else
      m.push_back(a[i]);
  }
  ll max = 1;
  // すべて
  if (n == k) {
    rep(i, k) max = (max * a[n - 1 - i]) % 1000000007;
    if (max < 0)
      max = max + 1000000007;
    cout << max;
    return 0;
  }

  p.push_back(0);
  m.push_back(0);
  sort(all(p));
  sort(all(m));

  ll b, c;
  int i, j;
  i = el(p) - 1;
  j = 0;

  // 負となるとき(すべてが負の数)
  if (i == 0 && k % 2 == 1) {
    rep(i, k) max = (max * m[el(m) - 2 - i]) % 1000000007;
    if (max < 0)
      max = max + 1000000007;
    cout << max;
    return 0;
  }
  // 絶対値が大きい順に取っていく
  rep(o, k) {
    if (p[i] > -1 * m[j])
      i--;
    else
      j++;
  }
  // 負になるとき
  if (j % 2 == 1) {
    if (i != el(p) - 1)
      b = p[i + 1] * p[i];
    else
      b = 1000000000000000001;
    c = m[j - 1] * m[j];
    if (b > c) {
      i--;
      j--;
    } else {
      i++;
      j++;
    }
  }
  rep(n, j) max = (max * m[n]) % 1000000007;
  for (int n = el(p) - 1; n > i; n--)
    max = (max * p[n]) % 1000000007;
  if (max < 0)
    max = max + 1000000007;
  cout << max;
  return 0;
}

Error: WA

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef long double ld;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define init(a, i)                                                             \\
  for (int k = 0; k < (i); k++)                                                \\
  (a)[k] = 0
#define in(a, i)                                                               \\
  for (int k = 0; k < (i); k++)                                                \\
  cin >> (a)[k]
#define all(a) (a).begin(), (a).end()
int main() {
  int n, k;
  cin >> n >> k;
  vector<ll> p, m;
  int a[n];
  rep(i, n) {
    cin >> a[i];
    if (a[i] >= 0)
      p.push_back(a[i]);
    else
      m.push_back(a[i]);
  }
  ll max = 1;
  if (n == k) {
    rep(i, k) max = (max * a[n - 1 + i]) % 1000000006;
    if (max < 0)
      max + 1000000006;
    cout << max;
    return 0;
  }
  p.push_back(-1);
  m.push_back(1);
  sort(all(p));
  sort(all(m));
  ll b, c;
  int i, j;
  i = p.size() - 1;
  j = 0;
  rep(o, k) {
    if (p[i] >= -1 * m[j])
      i--;
    else
      j++;
  }
  if (j % 2 == 1) {
    if (i > 0) {
      b = p[i] * p[i - 1];
    } else
      b = -1;
    if (j < m.size() - 1) {
      c = m[j] * m[j + 1];
    } else
      c = -1;
    if (b > c) {
      i++;
      j--;
    } else {
      i--;
      j++;
    }
  }
  rep(n, j) max = (max * m[n]) % 1000000006;
  for (int n = p.size() - 1; n > i; n--)
    max = (max * p[i]) % 1000000006;
  if (max < 0)
    max + 1000000006;
  cout << max;
  return 0;
}