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

// #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define range(i, a, b) ((a) <= (i) && (i) < (b))
#define debug(x) cout << #x << " = " << (x) << endl;
#define fs first
#define sc second
#define pb push_back
#define eb emplace_back
#define SP << " " <<

typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
typedef vector<int> vec;
typedef vector<P> pvec;
typedef vector<vector<int>> vvec;
typedef vector<vector<P>> pvvec;
typedef priority_queue<int> PQI;
typedef priority_queue<P> PQP;
typedef priority_queue<int, vector<int>, greater<int>> PQIG;
typedef priority_queue<P, vector<P>, greater<P>> PQPG;

const vector<int> DX = {0, -1, 0, 1, 1, 1, -1, -1};
const vector<int> DY = {1, 0, -1, 0, 1, -1, 1, -1};
constexpr int MOD = (1000000007);
// const int MOD = (998244353);
// const int INF = (1 << 30); // 1073741824
const ll INF = (1LL << 60); // 1152921504606846976
const double PI = (3.141592653589794);
const double EPS = (0.0000000001); // 10^(-10)

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline T ceil(T a, T b) { return T((a + b - 1) / b); }
template <class T> inline T round(T a, T b) { return T(a / b); }
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <class T> inline void out(T &a) {
  bool flag = true;
  for (auto &x : a) {
    if (flag) {
      flag = false;
    } else {
      cout << ' ';
    }
    cout << x;
  }
  cout << endl;
}

//----------------------------------------------------------------
int nmax = 200000; // 2*(10^5)
vvec G(nmax);

template <int MOD> struct modint {
  long long val;

  constexpr modint(long long v = 0) noexcept : val(v % MOD) {
    if (val < 0)
      v += MOD;
  }
  constexpr modint operator-() const noexcept { return val ? MOD - val : 0; }

  constexpr int getmod() { return MOD; }
  constexpr modint operator+(const modint &r) const noexcept {
    return modint(*this) += r;
  }
  constexpr modint operator-(const modint &r) const noexcept {
    return modint(*this) -= r;
  }
  constexpr modint operator*(const modint &r) const noexcept {
    return modint(*this) *= r;
  }
  constexpr modint operator/(const modint &r) const noexcept {
    return modint(*this) /= r;
  }
  constexpr modint &operator+=(const modint &r) noexcept {
    val += r.val;
    if (val >= MOD)
      val -= MOD;
    return *this;
  }
  constexpr modint &operator-=(const modint &r) noexcept {
    val -= r.val;
    if (val < 0)
      val += MOD;
    return *this;
  }
  constexpr modint &operator*=(const modint &r) noexcept {
    val = val * r.val % MOD;
    return *this;
  }
  constexpr modint &operator/=(const modint &r) noexcept {
    long long a = r.val, b = MOD, u = 1, v = 0;
    while (b) {
      long long t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    val = val * u % MOD;
    if (val < 0)
      val += MOD;
    return *this;
  }
  constexpr bool operator==(const modint &r) const noexcept {
    return this->val == r.val;
  }
  constexpr bool operator!=(const modint &r) const noexcept {
    return this->val != r.val;
  }
  friend constexpr ostream &operator<<(ostream &os,
                                       const modint<MOD> &x) noexcept {
    return os << x.val;
  }
  friend constexpr istream &operator>>(istream &is, modint<MOD> &x) noexcept {
    return is >> x.val;
  }
  friend constexpr modint<MOD> modpow(const modint<MOD> &a,
                                      long long n) noexcept {
    if (n == 0)
      return 1;
    auto t = modpow(a, n / 2);
    t = t * t;
    if (n & 1)
      t = t * a;
    return t;
  }
};
using mint = modint<MOD>;
typedef vector<mint> mvec;
typedef vector<vector<mint>> mvvec;

mint solve4ts() {

  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  sort(all(a));

  mint product = 1;
  if (a[n - 1] == 0 && (k & 1)) {
    return (mint)0;
  }
  if (a[n - 1] <= 0 && (k & 1)) {
    rep(i, k) { product *= (a[n - 1 - i] + MOD); }
    mint res = product + MOD;
    return res;
  }
  int i = 0;
  int j = n - 1;
  if (k & 1) {
    product *= a[j];
    j--;
    k--;
  }
  k = k / 2;
  for (int itr = 0; itr < k; itr++) {
    int leftProduct = a[i] * a[i + 1];
    int rightProduct = a[j] * a[j - 1];
    if (leftProduct > rightProduct) {
      product *= leftProduct + MOD;
      i += 2;
    } else {
      product *= rightProduct + MOD;
      j -= 2;
    }
  }
  return product;
}
//-----------------------------------------------------------------

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(15);
  int repeat = 1;
  // cin >> repeat;
  // while(repeat--) solve4ts();
  cout << solve4ts() << endl;
}

/*

g++ -std=c++1z code.cpp

./a.out

*/

Error: 0

Fixed submission:

// #define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define range(i, a, b) ((a) <= (i) && (i) < (b))
#define debug(x) cout << #x << " = " << (x) << endl;
#define fs first
#define sc second
#define pb push_back
#define eb emplace_back
#define SP << " " <<

typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
typedef vector<int> vec;
typedef vector<P> pvec;
typedef vector<vector<int>> vvec;
typedef vector<vector<P>> pvvec;
typedef priority_queue<int> PQI;
typedef priority_queue<P> PQP;
typedef priority_queue<int, vector<int>, greater<int>> PQIG;
typedef priority_queue<P, vector<P>, greater<P>> PQPG;

const vector<int> DX = {0, -1, 0, 1, 1, 1, -1, -1};
const vector<int> DY = {1, 0, -1, 0, 1, -1, 1, -1};
constexpr int MOD = (1000000007);
// const int MOD = (998244353);
// const int INF = (1 << 30); // 1073741824
const ll INF = (1LL << 60); // 1152921504606846976
const double PI = (3.141592653589794);
const double EPS = (0.0000000001); // 10^(-10)

template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> inline T ceil(T a, T b) { return T((a + b - 1) / b); }
template <class T> inline T round(T a, T b) { return T(a / b); }
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <class T> inline void out(T &a) {
  bool flag = true;
  for (auto &x : a) {
    if (flag) {
      flag = false;
    } else {
      cout << ' ';
    }
    cout << x;
  }
  cout << endl;
}

//----------------------------------------------------------------
int nmax = 200000; // 2*(10^5)
vvec G(nmax);

template <int MOD> struct modint {
  long long val;

  constexpr modint(long long v = 0) noexcept : val(v % MOD) {
    if (val < 0)
      v += MOD;
  }
  constexpr modint operator-() const noexcept { return val ? MOD - val : 0; }

  constexpr int getmod() { return MOD; }
  constexpr modint operator+(const modint &r) const noexcept {
    return modint(*this) += r;
  }
  constexpr modint operator-(const modint &r) const noexcept {
    return modint(*this) -= r;
  }
  constexpr modint operator*(const modint &r) const noexcept {
    return modint(*this) *= r;
  }
  constexpr modint operator/(const modint &r) const noexcept {
    return modint(*this) /= r;
  }
  constexpr modint &operator+=(const modint &r) noexcept {
    val += r.val;
    if (val >= MOD)
      val -= MOD;
    return *this;
  }
  constexpr modint &operator-=(const modint &r) noexcept {
    val -= r.val;
    if (val < 0)
      val += MOD;
    return *this;
  }
  constexpr modint &operator*=(const modint &r) noexcept {
    val = val * r.val % MOD;
    return *this;
  }
  constexpr modint &operator/=(const modint &r) noexcept {
    long long a = r.val, b = MOD, u = 1, v = 0;
    while (b) {
      long long t = a / b;
      a -= t * b;
      swap(a, b);
      u -= t * v;
      swap(u, v);
    }
    val = val * u % MOD;
    if (val < 0)
      val += MOD;
    return *this;
  }
  constexpr bool operator==(const modint &r) const noexcept {
    return this->val == r.val;
  }
  constexpr bool operator!=(const modint &r) const noexcept {
    return this->val != r.val;
  }
  friend constexpr ostream &operator<<(ostream &os,
                                       const modint<MOD> &x) noexcept {
    return os << x.val;
  }
  friend constexpr istream &operator>>(istream &is, modint<MOD> &x) noexcept {
    return is >> x.val;
  }
  friend constexpr modint<MOD> modpow(const modint<MOD> &a,
                                      long long n) noexcept {
    if (n == 0)
      return 1;
    auto t = modpow(a, n / 2);
    t = t * t;
    if (n & 1)
      t = t * a;
    return t;
  }
};
using mint = modint<MOD>;
typedef vector<mint> mvec;
typedef vector<vector<mint>> mvvec;

mint solve4ts() {

  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  rep(i, n) cin >> a[i];
  sort(all(a));

  mint product = 1;
  if (a[n - 1] == 0 && (k & 1)) {
    return (mint)0;
  }
  if (a[n - 1] <= 0 && (k & 1)) {
    rep(i, k) { product *= (a[n - 1 - i] + MOD); }
    mint res = product + MOD;
    return res;
  }
  int i = 0;
  int j = n - 1;
  if (k & 1) {
    product *= a[j];
    j--;
    k--;
  }
  k = k / 2;
  for (int itr = 0; i < k; itr++) {
    int leftProduct = a[i] * a[i + 1];
    int rightProduct = a[j] * a[j - 1];
    if (leftProduct > rightProduct) {
      product *= leftProduct;
      i += 2;
    } else {
      product *= rightProduct;
      j -= 2;
    }
  }
  return product;
}
//-----------------------------------------------------------------

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(15);
  int repeat = 1;
  // cin >> repeat;
  // while(repeat--) solve4ts();
  cout << (mint)solve4ts() << endl;
}

/*

g++ -std=c++1z code.cpp

./a.out

*/