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

#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5, M = 1e9 + 7, OO = 0x3f3f3f3f;
typedef long long ll;
#define FIO                                                                    \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);
const double Pii = 3.14159265359;
ll n, x, k;
ll a[N], b[N];

int main() {
  FIO vector<ll> pos, neg;
  bool z = 0;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    cin >> x;
    if (x > 0)
      pos.push_back(x);
    else if (x < 0)
      neg.push_back(-x);
    else
      z = 1;
  }

  sort(pos.begin(), pos.end());
  sort(neg.begin(), neg.end());

  int psz = pos.size(), nsz = neg.size();
  ll ans = 1;
  ll tk = 0;
  bool ok = 1;

  if (psz + ((nsz / 2) * 2) >= k && !(psz == 0 && k % 2 == 1)) {
    int p1 = psz - 1, p2 = nsz - 1;
    if (k % 2 == 1) {
      ans *= pos[p1--];
      ans %= M;
      tk++;
    }
    while (tk < k) {
      if (p2 > 0 && p1 > 0) {
        if (pos[p1] * pos[p1 - 1] > neg[p2] * neg[p2 - 1]) {
          ans *= pos[p1--];
          ans %= M;
          ans *= pos[p1--];
          ans %= M;
          tk += 2;
        } else {
          ans *= neg[p2--];
          ans %= M;
          ans *= neg[p2--];
          ans %= M;
          tk += 2;
        }
      } else if (p1 > 0) {
        ans *= pos[p1--];
        ans %= M;
        ans *= pos[p1--];
        ans %= M;
        tk += 2;
      } else {
        ans *= neg[p2--];
        ans %= M;
        ans *= neg[p2--];
        ans %= M;
        tk += 2;
      }
    }
  } else if (z)
    ans = 0;
  else {
    int p1 = 0, p2 = 0;
    while (tk < k) {
      if (p1 < psz && p2 < nsz) {
        if (pos[p1] < -neg[p2]) {
          ans *= pos[p1++];
          ans %= M;
        } else {
          ans *= neg[p2++];
          ans %= M;
        }
      } else if (p1 < psz) {
        ans *= pos[p1++];
        ans %= M;
      } else {
        ans *= neg[p2++];
        ans %= M;
      }
      tk++;
    }
    ok = 0;
  }
  if (ok)
    cout << ans << endl;
  else
    cout << ((M - ans) + M) % M << endl;
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
const long long N = 2e5 + 5, M = 1e9 + 7, OO = 0x3f3f3f3f;
typedef long long ll;
#define FIO                                                                    \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);
const double Pii = 3.14159265359;
ll n, x, k;
ll a[N], b[N];

int main() {
  FIO vector<int> pos, neg, z;
  cin >> n >> k;
  for (int i = 0; i < n; ++i) {
    cin >> x;
    if (x > 0)
      pos.push_back(x);
    else if (x < 0)
      neg.push_back(abs(x));
    else
      z.push_back(x);
  }
  sort(pos.begin(), pos.end());
  sort(neg.begin(), neg.end());
  int psz = pos.size(), nsz = neg.size(), zsz = z.size();
  ll ans = 1;
  ll tk = 0;
  bool ok = 1;
  if (((psz + (nsz / 2)) >= k) && !(!psz && k % 2 == 1)) {
    int p1 = psz - 1, p2 = nsz - 1;
    while (tk < k) {
      if (tk == k - 1) {
        ans *= pos[p1];
        p1--;
        tk++;
      } else if (p2 > 0 && p1 > 0) {
        if (pos[p1] * pos[p2] > neg[p2] * neg[p2 - 1]) {
          ans *= pos[p1--];
          ans %= M;
          ans *= pos[p1--];
          ans %= M;
          tk += 2;
        } else {
          ans *= neg[p2--];
          ans %= M;
          ans *= neg[p2--];
          ans %= M;
          tk += 2;
        }
      } else if (p1 > 0) {
        ans *= pos[p1--];
        ans %= M;
        ans *= pos[p1--];
        ans %= M;
        tk += 2;
      } else {
        ans *= neg[p2--];
        ans %= M;
        ans *= neg[p2--];
        ans %= M;
        tk += 2;
      }
    }
  } else if (zsz)
    ans = 0;
  else {
    // cout << "here" << endl;
    int p1 = 0, p2 = 0;
    while (tk < k) {
      if (p1 < psz && p2 < nsz) {
        if (pos[p1] < -neg[p2]) {
          ans *= pos[p1++];
          ans %= M;
        } else {
          ans *= neg[p2++];
          ans %= M;
        }
      } else if (p1 < psz) {
        ans *= pos[p1++];
        ans %= M;
      } else {
        ans *= neg[p2++];
        ans %= M;
      }
      tk++;
    }
    ok = 0;
  }
  if (ok)
    cout << ans << endl;
  else
    cout << ((M - ans) + M) % M << endl;
  return 0;
}