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

#include <algorithm>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <ctime>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
#pragma warning(disable : 4996)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const ld PI = 3.14159265358979323846;
const ll MOD = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll mul(ll a, ll b) { return (a * b) % MOD; }

bool cmp(int a, int b) { return abs(a) < abs(b); }

int main() {
#ifdef _DEBUG
  freopen("input1.txt", "r", stdin);
  freopen("output2.txt", "w", stdout);
#endif
  srand(time(0));
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<ll> a(n);
  int less = 0, eq = 0, more = 0;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    if (a[i] > 0)
      more++;
    else if (a[i] < 0)
      less++;
    else
      eq++;
  }
  sort(a.begin(), a.end());
  ll res = 1, l = 0, r = n - 1;
  bool ok = false;
  for (int i = 0; i <= more; i++) {
    if ((k - i) % 2 == 0 && less >= (k - i))
      ok = true;
  }
  if (ok) {
    while (k) {
      if (k > 1) {
        if (a[l] * a[l + 1] > a[r] * a[r - 1]) {
          res = mul(res, mul(a[l], a[l + 1]));
          k -= 2;
          l += 2;
        } else {
          res = mul(res, a[r]);
          r--;
          k--;
        }
      } else {
        res = mul(res, a[r]);
        r--;
        k--;
      }
    }
    res = (res + MOD) % MOD;
    assert(res >= 0);
    cout << res;
  } else if (eq > 0) {
    cout << 0;
  } else {
    sort(a.begin(), a.end(), cmp);
    for (int i = 0; i < k; i++) {
      res = mul(res, a[i]);
    }
    cout << (res + MOD) % MOD;
  }
}

Error: WA

Fixed submission:

#include <algorithm>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <ctime>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
#pragma warning(disable : 4996)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

const ld PI = 3.14159265358979323846;
const ll MOD = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

ll mul(ll a, ll b) { return (a * b) % MOD; }

bool cmp(int a, int b) { return abs(a) < abs(b); }

int main() {
#ifdef _DEBUG
  freopen("input1.txt", "r", stdin);
  freopen("output2.txt", "w", stdout);
#endif
  srand(time(0));
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<ll> a(n);
  int less = 0, eq = 0, more = 0;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    if (a[i] > 0)
      more++;
    else if (a[i] < 0)
      less++;
    else
      eq++;
  }
  sort(a.begin(), a.end());
  ll res = 1, l = 0, r = n - 1;
  bool ok = false;
  for (int i = 0; i <= more; i++) {
    if ((k - i) % 2 == 0 && less >= (k - i))
      ok = true;
  }
  if (ok) {
    vector<ll> b;
    for (int i = 0; i < n; i++) {
      if (i <= n - 2 && a[i] < 0 && a[i + 1] < 0) {
        b.push_back(a[i] * a[i + 1]);
        i++;
      } else if (a[i] > 0) {
        b.push_back(a[i]);
      }
    }
    sort(b.rbegin(), b.rend());
    for (int i = 0; i < k; i++) {
      res = mul(res, b[i] % MOD);
    }
    res = (res + MOD) % MOD;
    assert(res >= 0);
    cout << res;
  } else if (eq > 0) {
    cout << 0;
  } else {
    sort(a.begin(), a.end(), cmp);
    for (int i = 0; i < k; i++) {
      res = mul(res, a[i]);
    }
    cout << (res + MOD) % MOD;
  }
}