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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define rep2(i, s, n) for (int i = (s); i < (n); ++i)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define pb push_back
#define eb emplace_back
#define vi vector<int>
#define vvi vector<vector<int>>
#define vl vector<ll>
#define vvl vector<vector<ll>>
#define vd vector<double>
#define vs vector<string>
#define vc vector<char>
#define vb vector<bool>
#define vp vector<P>
using namespace std;
using ll = long long;
using P = pair<int, int>;
using LP = pair<ll, ll>;
template <class S, class T> istream &operator>>(istream &is, pair<S, T> &p) {
  return is >> p.first >> p.second;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &p) {
  return os << '{' << p.first << "," << p.second << '}';
}
template <class T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v) {
    is >> t;
  }
  return is;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << '[';
  rep(i, v.size()) os << v[i] << (i == v.size() - 1 ? ']' : ',');
  return os;
}
void Yes(bool b) { cout << (b ? "Yes" : "No") << endl; }
void YES(bool b) { cout << (b ? "YES" : "NO") << endl; }
template <class T> bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int inf = 1001001001;
const ll linf = 1001001001001001001;

const int mod = 1000000007;
// const int mod = 998244353;
struct mint {
  ll x;
  mint(ll x = 0) : x((x % mod + mod) % mod) {}
  mint operator-() const { return mint(-x); }
  mint &operator+=(const mint &a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator++() { return *this += mint(1); }
  mint &operator-=(const mint &a) {
    if ((x += mod - a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator--() { return *this -= mint(1); }
  mint &operator*=(const mint &a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }
  mint pow(ll t) const {
    mint res = mint(1), a(*this);
    while (t > 0) {
      if (t & 1)
        res *= a;
      t >>= 1;
      a *= a;
    }
    return res;
  }
  // for prime mod
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint &a) { return *this *= a.inv(); }
  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }
};
ostream &operator<<(ostream &os, const mint &m) { return os << m.x; }

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, k;
  cin >> n >> k;
  int zr = 0;
  vi pl, mi;
  rep(_, n) {
    int a;
    cin >> a;
    if (a > 0)
      pl.pb(a);
    else if (a == 0)
      zr++;
    else
      mi.pb(-a);
  }
  if (n - zr < k) {
    cout << 0 << endl;
    return 0;
  }
  int mn = max(int(k - pl.size()), 0);
  int mx = min(int(mi.size()), k);
  if (mn == mx and mn % 2 == 1) {
    if (zr)
      cout << 0 << endl;
    else {
      sort(all(pl));
      sort(all(mi));
      mint ans = 1;
      rep(i, mn) ans *= mi[i];
      rep(i, k - mn) ans *= pl[i];
      ans *= -1;
      cout << ans << endl;
    }
  } else {
    sort(rall(pl));
    sort(rall(mi));
    mint ans = 1;
    mn = (mn + 1) / 2 * 2;
    mx = mx / 2 * 2;
    rep(i, mn) ans *= mi[i];
    rep(i, k - mx) ans *= pl[i];
    vl v;
    int pos = mn;
    while (pos < mx) {
      v.pb(ll(mi[pos]) * mi[pos + 1]);
      pos += 2;
    }
    pos = k - mx;
    while (pos < k - mn) {
      v.pb(ll(pl[pos]) * pl[pos + 1]);
      pos += 2;
    }
    sort(rall(v));
    int rem = (mx - mn) / 2;
    rep(i, rem) ans *= v[i];
    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
#define rep2(i, s, n) for (int i = (s); i < (n); ++i)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define pb push_back
#define eb emplace_back
#define vi vector<int>
#define vvi vector<vector<int>>
#define vl vector<ll>
#define vvl vector<vector<ll>>
#define vd vector<double>
#define vs vector<string>
#define vc vector<char>
#define vb vector<bool>
#define vp vector<P>
using namespace std;
using ll = long long;
using P = pair<int, int>;
using LP = pair<ll, ll>;
template <class S, class T> istream &operator>>(istream &is, pair<S, T> &p) {
  return is >> p.first >> p.second;
}
template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &p) {
  return os << '{' << p.first << "," << p.second << '}';
}
template <class T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v) {
    is >> t;
  }
  return is;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  os << '[';
  rep(i, v.size()) os << v[i] << (i == v.size() - 1 ? ']' : ',');
  return os;
}
void Yes(bool b) { cout << (b ? "Yes" : "No") << endl; }
void YES(bool b) { cout << (b ? "YES" : "NO") << endl; }
template <class T> bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
const int inf = 1001001001;
const ll linf = 1001001001001001001;

const int mod = 1000000007;
// const int mod = 998244353;
struct mint {
  ll x;
  mint(ll x = 0) : x((x % mod + mod) % mod) {}
  mint operator-() const { return mint(-x); }
  mint &operator+=(const mint &a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator++() { return *this += mint(1); }
  mint &operator-=(const mint &a) {
    if ((x += mod - a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint &operator--() { return *this -= mint(1); }
  mint &operator*=(const mint &a) {
    (x *= a.x) %= mod;
    return *this;
  }
  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }
  mint pow(ll t) const {
    mint res = mint(1), a(*this);
    while (t > 0) {
      if (t & 1)
        res *= a;
      t >>= 1;
      a *= a;
    }
    return res;
  }
  // for prime mod
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint &a) { return *this *= a.inv(); }
  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }
};
ostream &operator<<(ostream &os, const mint &m) { return os << m.x; }

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n, k;
  cin >> n >> k;
  int zr = 0;
  vi pl, mi;
  rep(_, n) {
    int a;
    cin >> a;
    if (a > 0)
      pl.pb(a);
    else if (a == 0)
      zr++;
    else
      mi.pb(-a);
  }
  if (n - zr < k) {
    cout << 0 << endl;
    return 0;
  }
  int mn = max(int(k - pl.size()), 0);
  int mx = min(int(mi.size()), k);
  if (mn == mx and mn % 2 == 1) {
    assert(false);
    if (zr)
      cout << 0 << endl;
    else {
      sort(all(pl));
      sort(all(mi));
      mint ans = 1;
      rep(i, mn) ans *= mi[i];
      rep(i, k - mn) ans *= pl[i];
      ans *= -1;
      cout << ans << endl;
    }
  } else {
    sort(rall(pl));
    sort(rall(mi));
    mint ans = 1;
    mn = (mn + 1) / 2 * 2;
    mx = mx / 2 * 2;
    rep(i, mn) ans *= mi[i];
    rep(i, k - mx) ans *= pl[i];
    int rem = mx - mn;
    int pos_mi = mn, pos_pl = k - mx;
    while (rem > 0) {
      if (pos_mi + 2 <= mi.size() and pos_pl + 2 <= pl.size()) {
        ll c_mi = mi[pos_mi] * mi[pos_mi + 1];
        ll c_pl = pl[pos_pl] * pl[pos_pl + 1];
        if (c_mi > c_pl) {
          ans *= c_mi;
          pos_mi += 2;
        } else {
          ans *= c_pl;
          pos_pl += 2;
        }
      } else if (pos_mi + 2 <= mi.size()) {
        ans *= mi[pos_mi];
        ans *= mi[pos_mi + 1];
        pos_mi += 2;
      } else {
        ans *= pl[pos_pl];
        ans *= pl[pos_pl + 1];
        pos_pl += 2;
      }
      rem -= 2;
    }
    cout << ans << endl;
  }
}