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

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define ALL(v) (v).begin(), (v).end()
#define debug(x) cerr << #x << ": " << (x) << endl
#define INF (int)1e9
#define EPS (double)1e-9
#define MOD ((int)1e9 + 7)
using namespace std;
typedef long long llong;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef pair<int, int> pii;
template <class Type> void line(const Type &a) {
  int cnt = 0;
  for (const auto &elem : a) {
    if (cnt++)
      cerr << ' ';
    cout << elem;
  }
  cerr << endl;
}

int main() {
  int n, k;
  cin >> n >> k;

  vector<llong> m, p;
  REP(i, n) {
    int a;
    cin >> a;
    if (a < 0)
      m.push_back(a);
    else
      p.push_back(a);
  }

  if (k == n) { // 全部選ぶ場合.
    llong ans = 1;
    REP(i, m.size()) ans = ans * (MOD + m[i]) % MOD;
    REP(i, p.size()) ans = ans * p[i] % MOD;
    cout << ans << endl;
    return 0;
  }

  if (m.size() == n and k % 2 == 1) { // 全部負の数かつ奇数個選ぶ場合.
    llong ans = 1;
    sort(ALL(m), greater<llong>()); // 絶対値が小さくなるように.
    REP(i, k) ans = ans * (MOD + m[i]) % MOD;
    cout << ans << endl;
    return 0;
  }

  auto comp = [](int x, int y) { return abs(x) > abs(y); };
  sort(ALL(m), comp);
  sort(ALL(p), comp);

  llong ans = 1;
  int mp = 0, pp = 0;
  while (k > 0) {
    if (k == 1 or m.size() - mp < 2 or
        (m.size() - mp >= 2 and p.size() - pp >= 2 and
         m[mp] * m[mp + 1] < p[pp] * p[pp + 1])) {
      ans = ans * p[pp++] % MOD;
      k--;
    } else {
      REP(i, 2) ans = ans * (MOD + m[mp++]) % MOD;
      k -= 2;
    }
  }

  cout << ans << endl;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define ALL(v) (v).begin(), (v).end()
#define debug(x) cerr << #x << ": " << (x) << endl
#define INF (int)1e9
#define EPS (double)1e-9
#define MOD ((int)1e9 + 7)
using namespace std;
typedef long long llong;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef pair<int, int> pii;
template <class Type> void line(const Type &a) {
  int cnt = 0;
  for (const auto &elem : a) {
    if (cnt++)
      cerr << ' ';
    cout << elem;
  }
  cerr << endl;
}

int main() {
  int n, k;
  cin >> n >> k;

  vi m, p;
  REP(i, n) {
    int a;
    cin >> a;
    if (a < 0)
      m.push_back(a);
    else
      p.push_back(a);
  }

  if (k == n) { // 全部選ぶ場合.
    llong ans = 1;
    REP(i, m.size()) ans = ans * (MOD + m[i]) % MOD;
    REP(i, p.size()) ans = ans * p[i] % MOD;
    cout << ans << endl;
    return 0;
  }

  if (m.size() == n and k % 2 == 1) { // 全部負の数かつ奇数個選ぶ場合.
    llong ans = 1;
    sort(ALL(m), greater<int>()); // 絶対値が小さくなるように.
    REP(i, k) ans = ans * (MOD + m[i]) % MOD;
    cout << ans << endl;
    return 0;
  }

  auto comp = [](int x, int y) { return abs(x) > abs(y); };
  sort(ALL(m), comp);
  sort(ALL(p), comp);
  p.push_back(1);
  p.push_back(0);

  llong ans = 1;
  int mp = 0, pp = 0;
  while (k > 0) {
    if (k == 1 or m.size() - mp < 2 or m[mp] * m[mp + 1] < p[pp] * p[pp + 1]) {
      ans = ans * p[pp++] % MOD;
      k--;
    } else {
      REP(i, 2) ans = ans * (MOD + m[mp++]) % MOD;
      k -= 2;
    }
  }

  cout << ans << endl;
}