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

#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
using Int = long long;
const char newl = '\\n';

template <typename T, T MOD = 1000000007> struct Mint {
  static constexpr T mod = MOD;
  T v;
  Mint() : v(0) {}
  Mint(signed v) : v(v) {}
  Mint(long long t) {
    v = t % MOD;
    if (v < 0)
      v += MOD;
  }

  Mint pow(long long k) {
    Mint res(1), tmp(v);
    while (k) {
      if (k & 1)
        res *= tmp;
      tmp *= tmp;
      k >>= 1;
    }
    return res;
  }

  static Mint add_identity() { return Mint(0); }
  static Mint mul_identity() { return Mint(1); }

  Mint inv() { return pow(MOD - 2); }

  Mint &operator+=(Mint a) {
    v += a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator-=(Mint a) {
    v += MOD - a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator*=(Mint a) {
    v = 1LL * v * a.v % MOD;
    return *this;
  }
  Mint &operator/=(Mint a) { return (*this) *= a.inv(); }

  Mint operator+(Mint a) const { return Mint(v) += a; }
  Mint operator-(Mint a) const { return Mint(v) -= a; }
  Mint operator*(Mint a) const { return Mint(v) *= a; }
  Mint operator/(Mint a) const { return Mint(v) /= a; }

  Mint operator-() const { return v ? Mint(MOD - v) : Mint(v); }

  bool operator==(const Mint a) const { return v == a.v; }
  bool operator!=(const Mint a) const { return v != a.v; }
  bool operator<(const Mint a) const { return v < a.v; }

  static Mint comb(long long n, Int k) {
    Mint num(1), dom(1);
    for (Int i = 0; i < k; i++) {
      num *= Mint(n - i);
      dom *= Mint(i + 1);
    }
    return num / dom;
  }
};
template <typename T, T MOD> constexpr T Mint<T, MOD>::mod;
template <typename T, T MOD> ostream &operator<<(ostream &os, Mint<T, MOD> m) {
  os << m.v;
  return os;
}

template <typename T> void drop(const T &x) {
  cout << x << endl;
  exit(0);
}

template <typename T, typename... Ts> vector<T> fusion(vector<T> bs, Ts... ts) {
  auto append = [&](auto vs) {
    for (auto v : vs)
      bs.emplace_back(v);
  };
  initializer_list<Int>{(void(append(ts)), 0)...};
  return bs;
}

// INSERT ABOVE HERE
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  Int n, k;
  cin >> n >> k;
  vector<Int> as(n);
  for (Int i = 0; i < n; i++)
    cin >> as[i];

  vector<Int> ps, ns, zs;
  for (Int i = 0; i < n; i++) {
    if (as[i] > 0)
      ps.emplace_back(+as[i]);
    if (as[i] < 0)
      ns.emplace_back(-as[i]);
    if (as[i] == 0)
      zs.emplace_back(as[i]);
  }

  using M = Mint<Int>;
  // ans > 0
  if ((Int)ps.size() + (Int)ns.size() / 2 * 2 >= k) {
    Int d = min(k, (Int)ns.size()) / 2 * 2;
    if (k - d > (int)ps.size())
      goto UKU;

    sort(ps.rbegin(), ps.rend());
    sort(ns.rbegin(), ns.rend());

    M ans{1};
    for (Int i = 0; i < d; i++)
      ans *= M(ns[i]);
    for (Int i = 0; i < k - d; i++)
      ans *= M(ps[i]);

    for (Int i = k - d;
         i < k and i + 1 < (int)ps.size() and i - (k - d) + 2 <= d; i += 2) {
      if (ps[i + 0] * ps[i + 1] >
          ns[d - (i - (k - d) + 1)] * ns[d - (i - (k - d) + 2)]) {
        ans *= M(ps[i + 0]);
        ans *= M(ps[i + 1]);
        ans /= M(ns[d - (i - (k - d) + 1)]);
        ans /= M(ns[d - (i - (k - d) + 2)]);
        continue;
      }
      break;
    }
    drop(ans);
  }
UKU:

  // ans = 0
  if (!zs.empty())
    drop(0);

  // ans < 0
  auto bs = fusion(ps, ns);
  sort(bs.begin(), bs.end());
  M ans{1};
  for (Int i = 0; i < k; i++)
    ans *= M(bs[i]);
  cout << -ans << newl;
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2> inline void chmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
using Int = long long;
const char newl = '\\n';

template <typename T, T MOD = 1000000007> struct Mint {
  static constexpr T mod = MOD;
  T v;
  Mint() : v(0) {}
  Mint(signed v) : v(v) {}
  Mint(long long t) {
    v = t % MOD;
    if (v < 0)
      v += MOD;
  }

  Mint pow(long long k) {
    Mint res(1), tmp(v);
    while (k) {
      if (k & 1)
        res *= tmp;
      tmp *= tmp;
      k >>= 1;
    }
    return res;
  }

  static Mint add_identity() { return Mint(0); }
  static Mint mul_identity() { return Mint(1); }

  Mint inv() { return pow(MOD - 2); }

  Mint &operator+=(Mint a) {
    v += a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator-=(Mint a) {
    v += MOD - a.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  Mint &operator*=(Mint a) {
    v = 1LL * v * a.v % MOD;
    return *this;
  }
  Mint &operator/=(Mint a) { return (*this) *= a.inv(); }

  Mint operator+(Mint a) const { return Mint(v) += a; }
  Mint operator-(Mint a) const { return Mint(v) -= a; }
  Mint operator*(Mint a) const { return Mint(v) *= a; }
  Mint operator/(Mint a) const { return Mint(v) /= a; }

  Mint operator-() const { return v ? Mint(MOD - v) : Mint(v); }

  bool operator==(const Mint a) const { return v == a.v; }
  bool operator!=(const Mint a) const { return v != a.v; }
  bool operator<(const Mint a) const { return v < a.v; }

  static Mint comb(long long n, Int k) {
    Mint num(1), dom(1);
    for (Int i = 0; i < k; i++) {
      num *= Mint(n - i);
      dom *= Mint(i + 1);
    }
    return num / dom;
  }
};
template <typename T, T MOD> constexpr T Mint<T, MOD>::mod;
template <typename T, T MOD> ostream &operator<<(ostream &os, Mint<T, MOD> m) {
  os << m.v;
  return os;
}

template <typename T> void drop(const T &x) {
  cout << x << endl;
  exit(0);
}

template <typename T, typename... Ts> vector<T> fusion(vector<T> bs, Ts... ts) {
  auto append = [&](auto vs) {
    for (auto v : vs)
      bs.emplace_back(v);
  };
  initializer_list<Int>{(void(append(ts)), 0)...};
  return bs;
}

// INSERT ABOVE HERE
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  Int n, k;
  cin >> n >> k;
  vector<Int> as(n);
  for (Int i = 0; i < n; i++)
    cin >> as[i];

  vector<Int> ps, ns, zs;
  for (Int i = 0; i < n; i++) {
    if (as[i] > 0)
      ps.emplace_back(+as[i]);
    if (as[i] < 0)
      ns.emplace_back(-as[i]);
    if (as[i] == 0)
      zs.emplace_back(as[i]);
  }

  using M = Mint<Int>;
  // ans > 0
  if ((Int)ps.size() + (Int)ns.size() / 2 * 2 >= k) {
    if (k & 1 and ps.empty())
      goto UKU;
    sort(ps.rbegin(), ps.rend());
    sort(ns.rbegin(), ns.rend());

    M ans{1};
    Int d = min(k, (Int)ns.size()) / 2 * 2;
    for (Int i = 0; i < d; i++)
      ans *= M(ns[i]);
    for (Int i = 0; i < k - d; i++)
      ans *= M(ps[i]);

    for (Int i = k - d; i < k and i + 1 < (int)ps.size() and i + 2 <= d;
         i += 2) {
      if (ps[i + 0] * ps[i + 1] > ns[d - (i + 1)] * ns[d - (i + 2)]) {
        ans *= M(ps[i + 0]);
        ans *= M(ps[i + 1]);
        ans /= M(ns[d - (i + 1)]);
        ans /= M(ns[d - (i + 2)]);
        continue;
      }
      break;
    }
    drop(ans);
  }
UKU:
  abort();

  // ans = 0
  if (!zs.empty())
    drop(0);

  // ans < 0
  auto bs = fusion(ps, ns);
  sort(bs.begin(), bs.end());
  M ans{1};
  for (Int i = 0; i < k; i++)
    ans *= M(bs[i]);
  cout << -ans << newl;
  return 0;
}