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

#include "algorithm"
#include "bitset"
#include "cassert"
#include "climits"
#include "cmath"
#include "cstdio"
#include "ctime"
#include "functional"
#include "iomanip"
#include "iostream"
#include "list"
#include "map"
#include "numeric"
#include "queue"
#include "random"
#include "set"
#include "stack"
#include "string"
#include "unordered_map"
#include "unordered_set"

using namespace std;

constexpr long long int MOD = 1000000007;
// constexpr int MOD = 1000000007;
// constexpr int MOD = 998244353;
// constexpr long long int MOD = 998244353;
constexpr double EPS = 1e-9;

// int N, M, K, H, W, L, R;
long long int N, M, K, H, W, L, R;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  cin >> N >> K;
  long long int ans = 1;
  vector<long long int> p;
  vector<long long int> m;
  vector<long long int> z;
  for (int i = 0; i < N; i++) {
    cin >> M;
    if (M > 0)
      p.push_back(M);
    else if (M < 0)
      m.push_back(-M);
    else
      z.push_back(M);
  }
  sort(m.begin(), m.end());
  sort(p.begin(), p.end());
  if (p.size() + m.size() < K) {
    cout << 0 << endl;
    return 0;
  }
  if (p.empty()) {
    if (z.empty()) {
      if (K & 1) {
        long long int ans = 1;
        for (int i = 0; i < K; i++) {
          ans *= MOD - m[i];
          ans %= MOD;
        }
        cout << ans << endl;
      } else {
        reverse(m.begin(), m.end());
        long long int ans = 1;
        for (int i = 0; i < K; i++) {
          ans *= MOD - m[i];
          ans %= MOD;
        }
        cout << ans << endl;
      }
      return 0;
    } else if (K % 2 == 0 && m.size() >= K) {
      reverse(m.begin(), m.end());
      long long int ans = 1;
      for (int i = 0; i < K; i++) {
        ans *= MOD - m[i];
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;

    } else {
      cout << 0 << endl;
      return 0;
    }
  } else {
    if (p.size() + m.size() == K && m.size() % 2 == 1) {
      if (z.empty()) {
        long long int ans = 1;
        for (auto i : p) {
          ans *= i;
          ans %= MOD;
        }
        for (auto i : m) {
          ans *= MOD - i;
          ans %= MOD;
        }
        cout << ans << endl;
        return 0;
      } else {
        cout << 0 << endl;
        return 0;
      }
    } else {
      reverse(p.begin(), p.end());
      reverse(m.begin(), m.end());
      int pcnt = 0;
      int mcnt = 0;
      long long int ans = 1;
      while (K) {
        if (K >= 2) {
          if (pcnt + 2 + (K & 1) > p.size()) {
            ans *= MOD - m[mcnt];
            ans %= MOD;
            mcnt++;
            ans *= MOD - m[mcnt];
            ans %= MOD;
            mcnt++;
          } else if (mcnt + 2 > m.size()) {
            ans *= p[pcnt];
            ans %= MOD;
            pcnt++;
            ans *= p[pcnt];
            ans %= MOD;
            pcnt++;
          } else {
            if (p[pcnt] * p[pcnt + 1] > m[mcnt] * m[mcnt + 1]) {
              ans *= p[pcnt];
              ans %= MOD;
              pcnt++;
              ans *= p[pcnt];
              ans %= MOD;
              pcnt++;
            } else {
              ans *= MOD - m[mcnt];
              ans %= MOD;
              mcnt++;
              ans *= MOD - m[mcnt];
              ans %= MOD;
              mcnt++;
            }
          }
          K -= 2;
        } else {
          K--;
          ans *= p[pcnt];
          ans %= MOD;
        }
      }
      cout << ans << endl;
    }
  }
}


Error: 0

Fixed submission:

#include "algorithm"
#include "bitset"
#include "cassert"
#include "climits"
#include "cmath"
#include "cstdio"
#include "ctime"
#include "functional"
#include "iomanip"
#include "iostream"
#include "list"
#include "map"
#include "numeric"
#include "queue"
#include "random"
#include "set"
#include "stack"
#include "string"
#include "unordered_map"
#include "unordered_set"

using namespace std;

constexpr long long int MOD = 1000000007;
// constexpr int MOD = 1000000007;
// constexpr int MOD = 998244353;
// constexpr long long int MOD = 998244353;
constexpr double EPS = 1e-9;

// int N, M, K, H, W, L, R;
long long int N, M, K, H, W, L, R;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  cin >> N >> K;
  long long int ans = 1;
  vector<long long int> p;
  vector<long long int> m;
  vector<long long int> z;
  for (int i = 0; i < N; i++) {
    cin >> M;
    if (M > 0)
      p.push_back(M);
    else if (M < 0)
      m.push_back(-M);
    else
      z.push_back(M);
  }
  sort(m.begin(), m.end());
  sort(p.begin(), p.end());
  if (p.empty()) {
    if (z.empty()) {
      long long int ans = 1;
      for (int i = 0; i < K; i++) {
        ans *= MOD - m[i];
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      cout << 0 << endl;
      return 0;
    }
  } else {
    if (p.size() + m.size() == K && m.size() % 2 == 1) {
      if (z.empty()) {
        long long int ans = 1;
        for (auto i : p) {
          ans *= i;
          ans %= MOD;
        }
        for (auto i : m) {
          ans *= MOD - i;
          ans %= MOD;
        }
        cout << ans << endl;
        return 0;
      } else {
        cout << 0 << endl;
        return 0;
      }
    } else {
      reverse(p.begin(), p.end());
      reverse(m.begin(), m.end());
      int pcnt = 0;
      int mcnt = 0;
      long long int ans = 1;
      while (K) {
        if (K >= 2) {
          if (pcnt + 2 > p.size()) {
            ans *= MOD - m[mcnt];
            ans %= MOD;
            mcnt++;
            ans *= MOD - m[mcnt];
            ans %= MOD;
            mcnt++;
          } else if (mcnt + 2 > m.size()) {
            ans *= p[pcnt];
            ans %= MOD;
            pcnt++;
            ans *= p[pcnt];
            ans %= MOD;
            pcnt++;
          } else {
            if (p[pcnt] * p[pcnt + 1] > m[mcnt] * m[mcnt + 1]) {
              ans *= p[pcnt];
              ans %= MOD;
              pcnt++;
              ans *= p[pcnt];
              ans %= MOD;
              pcnt++;
            } else {
              ans *= MOD - m[mcnt];
              ans %= MOD;
              mcnt++;
              ans *= MOD - m[mcnt];
              ans %= MOD;
              mcnt++;
            }
          }
          K -= 2;
        } else {
          K--;
          ans *= p[pcnt];
          ans %= MOD;
        }
      }
      cout << ans << endl;
    }
  }
}