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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
int m_mul(int x, int y) { return 1LL * x * y % MOD; }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k, pos = 0, neg = 0, zero = 0;
  cin >> n >> k;
  vector<int> a(n);
  for (int &it : a) {
    cin >> it;
    if (it > 0)
      pos++;
    else if (it < 0)
      neg++;
    else
      zero++;
  }
  // cout << pos << ' ' << neg << ' ' << zero << endl;
  int ans = 1;
  if (pos == 0) {
    if (k > neg) {
      ans = 0;
    } else {
      if (k % 2 == 1) {
        if (zero > 0)
          ans = 0;
        else {
          sort(a.rbegin(), a.rend());
          for (int i = 0; i < k; i++)
            ans = m_mul(ans, abs(a[i]));
          ans = MOD - ans;
        }
      } else {
        sort(a.begin(), a.end());
        for (int i = 0; i < k; i++)
          ans = m_mul(ans, abs(a[i]));
        if (ans < 0)
          ans += MOD;
      }
    }
  } else {
    if (pos + neg < k) {
      ans = 0;
    } else {
      sort(a.begin(), a.end(), [](int x, int y) { return abs(x) > abs(y); });
      // for (int i = 0; i < n; i++)
      //     cout << a[i] << " ";
      // cout << endl;

      int i = 0;
      vector<int> P, N;
      for (i = 0; i < k; i++) {
        if (a[i] > 0)
          P.push_back(a[i]);
        else if (a[i] < 0)
          N.push_back(a[i]);
      }
      if ((int)N.size() % 2 == 1 && k < n) {
        int nxp = 0, nxn = 0;
        for (; i < n; i++) {
          if (a[i] < 0 && !nxn)
            nxn = a[i];
          else if (a[i] > 0 && !nxp)
            nxp = a[i];
          if ((nxn && nxp) || a[i] == 0)
            break;
        }
        // int x = (P.empty() ? 1 : P.back());
        if (P.empty() || (ll)nxp * P.back() >= (ll)nxn * N.back()) {
          N.pop_back();
          P.push_back(nxp);
        } else {
          P.pop_back();
          N.push_back(nxn);
        }
      }
      for (int it : P)
        ans = m_mul(ans, it);
      for (int it : N)
        ans = m_mul(ans, it);
      if (ans < 0)
        ans += MOD;
    }
  }
  cout << ans << endl;
  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
int m_mul(int x, int y) { return 1LL * x * y % MOD; }
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k, pos = 0, neg = 0, zero = 0;
  cin >> n >> k;
  vector<int> a(n);
  for (int &it : a) {
    cin >> it;
    if (it > 0)
      pos++;
    else if (it < 0)
      neg++;
    else
      zero++;
  }
  int ans = 1;
  if (pos == 0) {
    if (k > neg) {
      ans = 0;
    } else {
      if (k % 2 == 1) {
        if (zero)
          ans = 0;
        else {
          sort(a.rbegin(), a.rend());
          for (int i = 0; i < k; i++)
            ans = m_mul(ans, a[i]);
          if (ans < 0)
            ans += MOD;
        }
      } else {
        sort(a.begin(), a.end());
        for (int i = 0; i < k; i++)
          ans = m_mul(ans, a[i]);
        if (ans < 0)
          ans += MOD;
      }
    }
  } else {
    if (pos + neg < k) {
      ans = 0;
    } else {
      sort(a.begin(), a.end(), [](int x, int y) { return abs(x) > abs(y); });
      int i = 0;
      vector<int> P, N;
      for (i = 0; i < k; i++) {
        if (a[i] > 0)
          P.push_back(a[i]);
        else
          N.push_back(a[i]);
      }
      if ((int)N.size() % 2 == 1) {
        int nxp = 0, nxn = 0;
        for (; i < n; i++) {
          if (a[i] < 0 && !nxn)
            nxn = a[i];
          else if (a[i] > 0 && !nxp)
            nxp = a[i];
          if ((nxn && nxp) || a[i] == 0)
            break;
        }
        if ((ll)nxp * P.back() > (ll)nxn * N.back()) {
          N.pop_back();
          P.push_back(nxp);
        } else {
          P.pop_back();
          N.push_back(nxn);
        }
      }
      for (int it : P)
        ans = m_mul(ans, it);
      for (int it : N)
        ans = m_mul(ans, it);
    }
  }
  cout << ans << endl;
  return 0;
}