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

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i, m, n) for (int i = (m); i < (n); i++)
#define rep(i, n) REP(i, 0, n)
#define pb push_back
#define all(a) a.begin(), a.end()
#define rall(c) (c).rbegin(), (c).rend()
#define mp make_pair
#define endl '\\n'
#define vec vector<ll>
#define mat vector<vector<ll>>
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll inf = 1e9 + 7;
const ll mod = 1e9 + 7;
signed main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> pos(0);
  vector<ll> neg(0);

  rep(i, n) {
    ll b;
    cin >> b;
    if (b < 0) {
      neg.pb(-b);
    } else {
      pos.pb(b);
    }
  }
  sort(rall(pos));
  sort(rall(neg));
  ll i = 0;
  ll j = 0;
  ll ans = 1;
  if (n == k) {
    rep(i, pos.size()) { ans = ans * pos[i] % inf; }
    rep(i, neg.size()) { ans = ans * (-neg[i]) % inf; }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
    return 0;
  }
  if (neg.size() == n) {
    if (k % 2 == 0) {
      rep(i, k) { ans = ans * neg[i] % inf; }
      cout << ans << endl;
      return 0;
    }
    sort(all(neg));
    rep(i, k) { ans = ans * (-neg[i]) % inf; }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
    return 0;
  }
  ll cnt = 0;
  while (cnt < k) {
    if (i == pos.size()) {
      ans = ans * (-neg[j]) % inf;
      j++;
      cnt++;
    } else {
      if (j == neg.size()) {
        ans = ans * pos[i] % inf;
        i++;
        cnt++;
      } else {
        if (pos[i] > neg[j]) {
          ans = ans * pos[i] % inf;
          i++;
          cnt++;
        } else {
          ans = ans * (-neg[j]) % inf;
          j++;
          cnt++;
        }
      }
    }
  }
  if (j % 2 == 0) {
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
  } else {
    ll an1 = 1;
    ll an2 = 1;
    rep(k, i + 1) {
      if (k == pos.size())
        break;
      an1 = an1 * pos[k] % inf;
    }
    rep(k, j - 1) { an1 = an1 * (-neg[k]) % inf; }
    rep(k, i - 1) { an2 = an2 * pos[k] % inf; }
    rep(k, j + 1) {
      if (k == neg.size())
        break;
      an2 = an2 * (-neg[k]) % inf;
    }
    if (i == 0) {
      ans = an1;
    } else if (j == neg.size()) {
      ans = an1;
    } else {
      if (pos[i] * pos[i - 1] >= neg[j] * neg[j - 1]) {
        ans = an1;
      } else {
        ans = an2;
      }
    }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define REP(i, m, n) for (int i = (m); i < (n); i++)
#define rep(i, n) REP(i, 0, n)
#define pb push_back
#define all(a) a.begin(), a.end()
#define rall(c) (c).rbegin(), (c).rend()
#define mp make_pair
#define endl '\\n'
#define vec vector<ll>
#define mat vector<vector<ll>>
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll inf = 1e9 + 7;
const ll mod = 1e9 + 7;
signed main() {
  ll n, k;
  cin >> n >> k;
  vector<ll> pos(0);
  vector<ll> neg(0);

  rep(i, n) {
    ll b;
    cin >> b;
    if (b < 0) {
      neg.pb(-b);
    } else {
      pos.pb(b);
    }
  }
  sort(rall(pos));
  sort(rall(neg));
  ll i = 0;
  ll j = 0;
  ll ans = 1;
  if (n == k) {
    rep(i, pos.size()) { ans = ans * pos[i] % inf; }
    rep(i, neg.size()) { ans = ans * neg[i] % inf; }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
    return 0;
  }
  if (neg.size() == n) {
    sort(all(neg));
    rep(i, k) { ans = ans * (-neg[i]) % inf; }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
    return 0;
  }
  ll cnt = 0;
  while (cnt < k) {
    if (i == pos.size()) {
      ans = ans * (-neg[j]) % inf;
      j++;
      cnt++;
    } else {
      if (j == neg.size()) {
        ans = ans * pos[i] % inf;
        i++;
        cnt++;
      } else {
        if (pos[i] > neg[j]) {
          ans = ans * pos[i] % inf;
          i++;
          cnt++;
        } else {
          ans = ans * (-neg[j]) % inf;
          j++;
          cnt++;
        }
      }
    }
  }
  if (j % 2 == 0) {
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
  } else {
    cout << 1 / 0 << endl;
    ll an1 = 1;
    ll an2 = 1;
    rep(k, i + 1) {
      if (k == pos.size())
        break;
      an1 = an1 * pos[k] % inf;
    }
    rep(k, j - 1) { an1 = an1 * (-neg[k]) % inf; }
    rep(k, i - 1) { an2 = an2 * pos[k] % inf; }
    rep(k, j + 1) {
      if (k == neg.size())
        break;
      an2 = an2 * (-neg[k]) % inf;
    }
    if (i == 0) {
      ans = an1;
    } else if (j == neg.size()) {
      ans = an1;
    } else {
      if (pos[i] * pos[i - 1] >= neg[j] * neg[j - 1]) {
        ans = an1;
      } else {
        ans = an2;
      }
    }
    if (ans < 0)
      ans += inf;
    cout << ans << endl;
  }
}