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

#include <bits/stdc++.h>
using namespace std;
#define reps(i, s, n) for (int i = s; i < n; i++)
#define rep(i, n) reps(i, 0, n)
#define Rreps(i, n, e) for (int i = n - 1; i >= e; --i)
#define Rrep(i, n) Rreps(i, n, 0)
#define ALL(a) a.begin(), a.end()
#define fi first
#define se second
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;

ll N, M, H, W, Q, K, A, B;
string S;
// const ll MOD = 998244353;
const ll MOD = (1e+9) + 7;
typedef pair<ll, ll> P;
const ll INF = (1LL << 58);

class mint {
public:
  ll x;
  static long long mod;
  static long long mod_plus;
  mint() { x = 0; }
  mint(ll _x)
      : x((_x < 0 ? ((_x += mod_plus) < 0 ? _x + mod_plus : _x) : _x) % mod) {}
  /*mint& operator=(const ll &a){
      x = a;
      return *this;
  }*/

  mint operator-() { return x == 0 ? 0 : mod - x; }
  mint &operator+=(const mint &a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }
  mint &operator-=(const mint &a) {
    if ((x -= a.x) < 0)
      x += mod;
    return *this;
  }
  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }
  mint &operator*=(const mint &a) {
    (x *= a.x) %= mod;
    return *this;
  }
  /*mint& operator*=(const ll& a){
      mint temp(a);
      return *this *= temp;
  }*/
  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }
  /*mint operator*(const ll& a) const{
      mint res(*this);
      return res *= a;
  }*/
  mint pow(unsigned long long pw) const {
    mint res(1), comp(*this);
    while (pw) {
      if (pw & 1)
        res *= comp;
      comp *= comp;
      pw >>= 1;
    }
    return res;
  }
  // 以下、modが素数のときのみ
  mint inv() const {
    mint res(*this);
    return res.pow(mod - 2);
  }
  mint &operator/=(const mint &a) {
    (x *= a.inv().x) %= mod;
    return *this;
  }
  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }
};
ostream &operator<<(ostream &os, const mint &a) {
  os << a.x;
  return os;
}
long long mint::mod = int(1e+9) + 7;
long long mint::mod_plus = (LLONG_MAX / mint::mod) * mint::mod;
typedef vector<mint> vm;

int main() {
  cin >> N >> K;
  vec a(0), b(0);
  rep(i, N) {
    cin >> A;
    if (A != 0)
      (A > 0 ? a.push_back(A) : b.push_back(-A));
  }
  sort(ALL(a));
  sort(ALL(b));
  reverse(ALL(a));
  reverse(ALL(b));
  ll as = a.size(), bs = b.size();
  if (as + bs < K) {
    cout << 0 << endl;
  } else if (as + bs == K) {
    mint res(1);
    rep(i, as) res *= a[i];
    rep(i, bs) res *= b[i];
    if (bs & 1) {
      if (as + bs < N)
        cout << 0 << endl;
      else
        cout << (MOD - res.x) % MOD << endl;
    } else {
      cout << res << endl;
    }
  } else if (as == 0) {
    if (K & 1) {
      mint res(MOD - 1);
      rep(i, K) res *= b[bs - i - 1];
      if (as + bs < N)
        cout << 0 << endl;
      else
        cout << res << endl;
    } else {
      mint res(1);
      rep(i, K) res *= b[i];
      cout << res << endl;
    }
  } else {
    vec can(0);
    for (int i = 0; i <= bs; i += 2) {
      if (K - i <= as && K - i >= 0)
        can.push_back(i);
    }
    ll last = can[0];
    for (ll bnum : can) {
      ll anum = K - bnum;
      if (bnum - 2 < 0 || anum + 1 >= as)
        continue;
      if (b[bnum - 1] * b[bnum - 2] > a[anum] * a[anum + 1])
        last = bnum;
    }
    mint res(1);
    rep(i, last) res *= b[i];
    rep(i, K - last) res *= a[i];
    cout << res << endl;
  }
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define reps(i, s, n) for (int i = s; i < n; i++)
#define rep(i, n) reps(i, 0, n)
#define Rreps(i, n, e) for (int i = n - 1; i >= e; --i)
#define Rrep(i, n) Rreps(i, n, 0)
#define ALL(a) a.begin(), a.end()
#define fi first
#define se second
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;

ll N, M, H, W, Q, K, A, B;
string S;
// const ll MOD = 998244353;
const ll MOD = (1e+9) + 7;
typedef pair<ll, ll> P;
const ll INF = (1LL << 58);

class mint {
public:
  ll x;
  static unsigned long long mod;
  static unsigned long long mod_plus;
  mint() { x = 0; }
  mint(ll _x)
      : x((_x < 0 ? ((_x += mod_plus) < 0 ? _x + mod_plus : _x) : _x) % mod) {}
  /*mint& operator=(const ll &a){
      x = a;
      return *this;
  }*/

  mint operator-() { return x == 0 ? 0 : mod - x; }
  mint &operator+=(const mint &a) {
    if ((x += a.x) >= mod)
      x -= mod;
    return *this;
  }
  mint operator+(const mint &a) const {
    mint res(*this);
    return res += a;
  }
  mint &operator-=(const mint &a) {
    if ((x -= a.x) < 0)
      x += mod;
    return *this;
  }
  mint operator-(const mint &a) const {
    mint res(*this);
    return res -= a;
  }
  mint &operator*=(const mint &a) {
    (x *= a.x) %= mod;
    return *this;
  }
  /*mint& operator*=(const ll& a){
      mint temp(a);
      return *this *= temp;
  }*/
  mint operator*(const mint &a) const {
    mint res(*this);
    return res *= a;
  }
  /*mint operator*(const ll& a) const{
      mint res(*this);
      return res *= a;
  }*/
  mint pow(unsigned long long pw) const {
    mint res(1), comp(*this);
    while (pw) {
      if (pw & 1)
        res *= comp;
      comp *= comp;
      pw >>= 1;
    }
    return res;
  }
  // 以下、modが素数のときのみ
  mint inv() const {
    mint res(*this);
    return res.pow(mod - 2);
  }
  mint &operator/=(const mint &a) {
    (x *= a.inv().x) %= mod;
    return *this;
  }
  mint operator/(const mint &a) const {
    mint res(*this);
    return res /= a;
  }
};
ostream &operator<<(ostream &os, const mint &a) {
  os << a.x;
  return os;
}
unsigned long long mint::mod = int(1e+9) + 7;
unsigned long long mint::mod_plus = (LLONG_MAX / mint::mod) * mint::mod;
typedef vector<mint> vm;

int main() {
  cin >> N >> K;
  vec a(0), b(0);
  rep(i, N) {
    cin >> A;
    if (A != 0)
      (A > 0 ? a.push_back(A) : b.push_back(-A));
  }
  sort(ALL(a));
  sort(ALL(b));
  reverse(ALL(a));
  reverse(ALL(b));
  ll as = a.size(), bs = b.size();
  if (as + bs < K) {
    cout << 0 << endl;
  } else if (as + bs == K) {
    mint res(1);
    rep(i, as) res *= a[i];
    rep(i, bs) res *= b[i];
    if (bs & 1) {
      if (as + bs < N)
        cout << 0 << endl;
      else
        cout << (MOD - res.x) % MOD << endl;
    } else {
      cout << res << endl;
    }
  } else if (as == 0) {
    if (K & 1) {
      mint res(MOD - 1);
      rep(i, K) res *= b[bs - i - 1];
      if (as + bs < N)
        cout << 0 << endl;
      else
        cout << res << endl;
    } else {
      mint res(1);
      rep(i, K) res *= b[i];
      cout << res << endl;
    }
  } else {
    vec can(0);
    for (int i = 0; i <= bs; i += 2) {
      if (K - i <= as)
        can.push_back(i);
    }
    ll last = can[0];
    for (ll bnum : can) {
      ll anum = K - bnum;
      if (bnum - 2 < 0 || anum + 1 >= as)
        continue;
      if (b[bnum - 1] * b[bnum - 2] > a[anum] * a[anum + 1])
        last = bnum;
    }
    mint res(1);
    rep(i, last) res *= b[i];
    rep(i, K - last) res *= a[i];
    cout << res << endl;
  }
}