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

#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) x
#define WATCH(x) TRACE(cout << #x " = " << x << endl)
#define PRINT(x) TRACE(printf(x))
#define WATCHR(a, b)                                                           \\
  TRACE(for (auto c = a; c != b;) cout << *(c++) << " "; cout << endl)
#define WATCHC(V)                                                              \\
  TRACE({                                                                      \\
    cout << #V " = ";                                                          \\
    WATCHR(V.begin(), V.end());                                                \\
  })
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define trav(a, x) for (auto &a : x)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
#define mp make_pair
#define st first
#define nd second

using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using ld = long double;
using pll = pair<ll, ll>;
using vll = vector<ll>;
using pll = pair<ll, ll>;

void buff() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
}

constexpr ll MOD = 1e9 + 7;

inline ll pow_mod(ll a, ll b, ll mod = MOD) {
  ll res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1)
      res = (res * a) % mod;
    a = (a * a) % mod;
  }
  return res;
}
// End of template code!
int main() {
  buff();
  int n, k;
  cin >> n >> k;
  vector<long long> neg, pos;
  vector<long long> tudo_junto;

  rep(i, 0, n) {
    long long v;
    cin >> v;
    tudo_junto.emplace_back(v);
    if (v >= 0)
      pos.push_back(v);
    else
      neg.push_back(v);
  }

  int positive = sz(pos), negative = sz(neg);

  sort(neg.begin(), neg.end());
  sort(pos.rbegin(), pos.rend());

  sort(all(tudo_junto),
       [&](long long &a, long long &b) { return llabs(a) < llabs(b); });

  int qnt_negative = -1;
  // os elementos negativos entre [0, cur_min_id] estao atualmente selecionados

  // vamos pegar uma quantidade par de caras negativos [n_1, n_2, n_3, n_4, ...,
  // n_2m-1, n_2m]
  for (int x = 0; x <= k; x += 2) {
    if (x > negative)
      break;
    int complemento = (k - x);
    if (complemento <= positive) {
      qnt_negative = x;
      break;
    }
  }

  if (qnt_negative == -1) {
    // melhor coisa que da pra fazer eh pegar os K com menor modulo
    long long res = tudo_junto[0];
    if (res < 0)
      res = (res + MOD) % MOD;
    for (int i = 1; i < k; ++i) {
      long long mul = tudo_junto[i];
      if (mul < 0)
        mul = (mul + MOD) % MOD;
      res = (res * mul) % MOD;
    }
    cout << res << '\\n';
  } else {
    int cur_neg = qnt_negative;
    while (cur_neg + 2 <= negative && (cur_neg + 2) <= k) {
      // vamos colocar mais dois positivos
      // vou basicamente remover positivos
      long long cur_pos = (k - cur_neg);
      long long rem = (pos[cur_pos - 1] * pos[cur_pos - 2]);
      long long add = (neg[cur_neg] * neg[cur_neg + 1]);
      if (rem > add)
        break;
      cur_neg = cur_neg + 2;
    }

    long long res = 1ll;

    for (int i = 0; i < cur_neg; ++i) {
      long long fat = (neg[i] + MOD) % MOD;
      res = (res * fat) % MOD;
    }

    int cur_pos = (k - cur_neg);

    for (int i = 0; i < cur_pos; ++i) {
      res = (res * pos[i]) % MOD;
    }

    cout << res << '\\n';
  }
  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) x
#define WATCH(x) TRACE(cout << #x " = " << x << endl)
#define PRINT(x) TRACE(printf(x))
#define WATCHR(a, b)                                                           \\
  TRACE(for (auto c = a; c != b;) cout << *(c++) << " "; cout << endl)
#define WATCHC(V)                                                              \\
  TRACE({                                                                      \\
    cout << #V " = ";                                                          \\
    WATCHR(V.begin(), V.end());                                                \\
  })
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define trav(a, x) for (auto &a : x)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int)(x).size()
#define mp make_pair
#define st first
#define nd second

using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using ld = long double;
using pll = pair<ll, ll>;
using vll = vector<ll>;
using pll = pair<ll, ll>;

void buff() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
}

constexpr ll MOD = 1e9 + 7;

inline ll pow_mod(ll a, ll b, ll mod = MOD) {
  ll res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1)
      res = (res * a) % mod;
    a = (a * a) % mod;
  }
  return res;
}
// End of template code!
int main() {
  buff();
  int n, k;
  cin >> n >> k;
  vector<long long> neg, pos;
  vector<long long> tudo_junto;

  rep(i, 0, n) {
    long long v;
    cin >> v;
    tudo_junto.emplace_back(v);
    if (v >= 0)
      pos.push_back(v);
    else
      neg.push_back(v);
  }

  int positive = sz(pos), negative = sz(neg);

  sort(neg.rbegin(), neg.rend());
  sort(pos.rbegin(), pos.rend());

  sort(all(tudo_junto),
       [&](long long &a, long long &b) { return llabs(a) < llabs(b); });

  int qnt_negative = -1;
  // os elementos negativos entre [0, cur_min_id] estao atualmente selecionados

  // vamos pegar uma quantidade par de caras negativos [n_1, n_2, n_3, n_4, ...,
  // n_2m-1, n_2m]
  for (int x = 0; x <= k; x += 2) {
    if (x > negative)
      break;
    int complemento = (k - x);
    if (complemento <= positive) {
      qnt_negative = x;
      break;
    }
  }

  if (qnt_negative == -1) {
    // melhor coisa que da pra fazer eh pegar os K com menor modulo
    long long res = tudo_junto[0];
    if (res < 0)
      res = (res + MOD) % MOD;
    for (int i = 1; i < k; ++i) {
      long long mul = tudo_junto[i];
      if (mul < 0)
        mul = (mul + MOD) % MOD;
      res = (res * mul) % MOD;
    }
    cout << res << '\\n';
  } else {
    int cur_neg = qnt_negative;
    while (cur_neg + 2 <= negative) {
      // vamos colocar mais dois positivos
      // vou basicamente remover positivos
      long long cur_pos = (k - cur_neg);
      long long rem = (pos[cur_pos - 1] * pos[cur_pos - 2]);
      long long add = (neg[cur_neg] * neg[cur_neg + 1]);
      if (rem > add)
        break;
      cur_neg = cur_neg + 2;
    }

    long long res = 1ll;

    for (int i = 0; i < cur_neg; ++i) {
      long long fat = (neg[i] + MOD) % MOD;
      res = (res * fat) % MOD;
    }

    int cur_pos = (k - cur_neg);

    for (int i = 0; i < cur_pos; ++i) {
      res = (res * pos[i]) % MOD;
    }

    cout << res << '\\n';
  }
  return 0;
}