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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define REP(i, a, b) for (ll i = (a); i < (b); i++)
#define PER(i, a, b) for (ll i = (a); i >= (b); i--)
#define rep(i, n) REP(i, 0, n)
#define per(i, n) PER(i, n, 0)
#define ALL(a) (a).begin(), (a).end()
const ll INF = 1e18 + 18;
const ll MAX = 200000;
const ll MOD = 1000000007;
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl;
#define YES(n) cout << ((n) ? "YES" : "NO") << endl;

int main() {
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N);
  priority_queue<ll> B, S;
  ll ZeroCnt = 0;
  ll Next = 1;
  rep(i, N) {
    cin >> A[i];
    if (A[i] > 0)
      B.push(A[i]);
    if (A[i] < 0)
      S.push(A[i] * -1);
    if (A[i] == 0)
      ZeroCnt++;
  }
  if (ZeroCnt + K > N) {
    cout << 0 << endl;
    return 0;
  }
  ll Ans = 1;
  if (K % 2) {
    if (B.size() > 0) {
      Ans *= B.top();
      B.pop();
      K--;
      if (K == 0) {
        cout << Ans << endl;
        return 0;
      }
    } else {
      if (ZeroCnt > 0) {
        cout << 0 << endl;
        return 0;
      } else {
        sort(ALL(A));
        reverse(ALL(A));
        rep(i, K) {
          Ans *= (A[i] + MOD);
          Ans %= MOD;
        }
        cout << Ans << endl;
        return 0;
      }
    }
  }

  ll Sz = B.size() / 2 + S.size() / 2;
  if (Sz < K / 2) {
    if (ZeroCnt > 0) {
      cout << 0 << endl;
      return 0;
    }
    // 全て選ぶパターン？
    Ans = 1;
    rep(i, N) {
      Ans *= (A[i] + MOD);
      Ans %= MOD;
    }
    cout << Ans << endl;
    return 0;
  }
  ll Big = -1;
  ll Small = -1;
  if (B.size() >= 2) {
    Big = B.top();
    B.pop();
    Big *= B.top();
    B.pop();
  }
  if (S.size() >= 2) {
    Small = S.top();
    S.pop();
    Small *= S.top();
    S.pop();
  }
  if (Big > Small) {
    Big %= MOD;
    Ans *= Big;
    Big = -1;
  } else {
    Small %= MOD;
    Ans *= Small;
    Small = -1;
  }
  Ans %= MOD;
  K -= 2;
  while (K > 0) {
    if (Big == -1 && B.size() >= 2) {
      Big = B.top();
      B.pop();
      Big *= B.top();
      B.pop();
    }
    if (Small == -1 && S.size() >= 2) {
      Small = S.top();
      S.pop();
      Small *= S.top();
      S.pop();
    }
    if (Big > Small) {
      Big %= MOD;
      Ans *= Big;
      Big = -1;
    } else {
      Small %= MOD;
      Ans *= Small;
      Small = -1;
    }
    Ans %= MOD;
    K -= 2;
  }
  cout << Ans << endl;
  return 0;
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define REP(i, a, b) for (ll i = (a); i < (b); i++)
#define PER(i, a, b) for (ll i = (a); i >= (b); i--)
#define rep(i, n) REP(i, 0, n)
#define per(i, n) PER(i, n, 0)
#define ALL(a) (a).begin(), (a).end()
const ll INF = 1e18 + 18;
const ll MAX = 200000;
const ll MOD = 1000000007;
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl;
#define YES(n) cout << ((n) ? "YES" : "NO") << endl;

int main() {
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N);
  priority_queue<ll> B, S;
  ll ZeroCnt = 0;
  ll Next = 1;
  rep(i, N) {
    cin >> A[i];
    if (A[i] > 0)
      B.push(A[i]);
    if (A[i] < 0)
      S.push(A[i] * -1);
    if (A[i] == 0)
      ZeroCnt++;
  }
  if (ZeroCnt + K > N) {
    cout << 0 << endl;
    return 0;
  }
  ll Ans = 1;
  if (K % 2) {
    if (B.size() > 0) {
      Ans *= B.top();
      B.pop();
      K--;
      if (K == 0) {
        cout << Ans << endl;
        return 0;
      }
    } else {
      if (ZeroCnt > 0) {
        cout << 0 << endl;
        return 0;
      } else {
        sort(ALL(A));
        reverse(ALL(A));
        rep(i, K) {
          Ans *= (A[i] + MOD);
          Ans %= MOD;
        }
        cout << Ans << endl;
        return 0;
      }
    }
  }

  ll Sz = B.size() / 2 + S.size() / 2;
  if (Sz < K / 2) {
    if (ZeroCnt > 0) {
      cout << 0 << endl;
      return 0;
    }
    // 全て選ぶパターン？
    Ans = 1;
    rep(i, N) {
      Ans *= (A[i] + MOD);
      Ans %= MOD;
    }
    cout << Ans << endl;
    return 0;
  }
  Ans += A[MOD];
  ll Big = 1;
  ll Small = 1;
  if (B.size() >= 2) {
    Big = B.top();
    B.pop();
    Big *= B.top();
    B.pop();
  }
  if (S.size() >= 2) {
    Small = S.top();
    S.pop();
    Small *= S.top();
    S.pop();
  }
  if (Big > Small) {
    Big %= MOD;
    Ans *= Big;
    Next = 1;
    Big = -1;
  } else {
    Small %= MOD;
    Ans *= Small;
    Next = 0;
    Small = -1;
  }
  Ans %= MOD;
  K -= 2;
  while (K > 0) {
    if (Next && B.size() >= 2) {
      Big = B.top();
      B.pop();
      Big *= B.top();
      B.pop();
    } else if (S.size() >= 2) {
      Small = S.top();
      S.pop();
      Small *= S.top();
      S.pop();
    } else if (B.size() >= 2) {
      Big = B.top();
      B.pop();
      Big *= B.top();
      B.pop();
    }
    if (Big > Small) {
      Big %= MOD;
      Ans *= Big;
      Next = 1;
      Big = -1;
    } else {
      Small %= MOD;
      Ans *= Small;
      Next = 0;
      Small = -1;
    }
    Ans %= MOD;
    K -= 2;
  }
  cout << Ans << endl;
  return 0;
}