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

#include <bits/stdc++.h>

// #pragma GCC optimize("Ofast")

#define fi first
#define se second
#define ll long long
#define dl double long

using namespace std;

const int NN = 1e9 + 7;
const int N = 2e5 + 7;
const int M = 26;
const ll mod = 1e9 + 7;
const int inf = 1e9 + 7;
const dl rf = 1e-14;
const int B = sqrt(N);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n, k;
ll a[N];

void solve1() {
  cin >> n >> k;
  vector<ll> A, B;
  ll ans = 1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] < 0)
      A.push_back(-a[i]);
    else
      B.push_back(a[i]);
    ans = ans * a[i];
    ans %= mod;
  }
  if (n == k) {
    cout << (ans + mod) % mod;
    return;
  }
  ans = 1;
  if ((int)A.size() + (int)B.size() < k) {
    cout << 0;
    return;
  }
  sort(A.rbegin(), A.rend());
  sort(B.rbegin(), B.rend());
  if (B.empty()) {
    if (k % 2)
      reverse(A.begin(), A.end());
    for (int i = 0; i < k; i++) {
      ans *= -A[i];
      ans %= mod;
    }
    cout << (ans + mod) % mod;
  } else {
    swap(A, B);
    int n1 = (int)A.size();
    int n2 = (int)B.size();
    int i = 0, j = 0, s = 0;
    while (s < k) {
      s += 1;
      if (s == k) {
        ans *= A[i];
        ans %= mod;
        break;
      }
      if (i + 1 < n1 && j + 1 < n2) {
        if (A[i] * A[i + 1] > B[j] * B[j + 1]) {
          ans *= A[i] % mod;
          ans %= mod;
          i += 1;
        } else {
          ans *= B[j] * B[j + 1] % mod;
          ans %= mod;
          s += 1;
          j += 2;
        }
      } else {
        if (j + 1 < n2) {
          if (i < n1 && A[i] > B[j] * B[j + 1]) {
            ans *= A[i];
            ans %= mod;
            i += 1;
          } else {
            ans *= B[j] * B[j + 1] % mod;
            s += 1;
            ans %= mod;
            j += 2;
          }
        } else {
          ans *= A[i];
          ans %= mod;
          i += 1;
        }
      }
    }
    cout << (ans + mod) % mod;
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // freopen( "input.txt" , "r" , stdin );
  // freopen( "output.txt" , "w" , stdout );

  int cghf = 1; // cin >> cghf;
  while (cghf--) {
    solve1();
  }
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>

// #pragma GCC optimize("Ofast")

#define fi first
#define se second
#define ll long long
#define dl double long

using namespace std;

const int NN = 1e9 + 7;
const int N = 2e5 + 7;
const int M = 26;
const ll mod = 1e9 + 7;
const int inf = 1e9 + 7;
const dl rf = 1e-14;
const int B = sqrt(N);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n, k;
ll a[N];

void solve1() {
  cin >> n >> k;
  vector<ll> A, B;
  ll ans = 1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    if (a[i] < 0)
      A.push_back(-a[i]);
    else
      B.push_back(a[i]);
    ans = ans * a[i];
    ans %= mod;
  }
  if (n == k) {
    cout << (ans + mod) % mod;
    return;
  }
  ans = 1;
  if ((int)A.size() + (int)B.size() < k) {
    cout << 0;
    return;
  }
  sort(A.rbegin(), A.rend());
  sort(B.rbegin(), B.rend());
  if (B.empty()) {
    if (k % 2)
      reverse(A.begin(), A.end());
    for (int i = 0; i < k; i++) {
      ans *= -A[i];
      ans %= mod;
    }
    cout << (ans + mod) % mod;
  } else {
    swap(A, B);
    int n1 = (int)A.size();
    int n2 = (int)B.size();
    int i = 0, j = 0, s = 0;
    while (s < k) {
      s += 1;
      if (s == k) {
        ans *= A[i];
        ans %= mod;
        break;
      }
      if (i + 1 < n1 && j + 1 < n2) {
        if (A[i] * A[i + 1] > B[j] * B[j + 1]) {
          ans *= A[i] * A[i + 1] % mod;
          ans %= mod;
          s += 1;
          i += 2;
        } else {
          ans *= B[i] * B[i + 1] % mod;
          ans %= mod;
          s += 1;
          j += 2;
        }
      } else {
        if (j + 1 < n2) {
          if (i < n1 && A[i] > B[j] * B[j + 1]) {
            ans *= A[i];
            ans %= mod;
            i += 1;
          } else {
            ans *= B[j] * B[j + 1] % mod;
            s += 1;
            ans %= mod;
            j += 1;
          }
        } else {
          ans *= A[i];
          ans %= mod;
          i += 1;
        }
      }
    }
    cout << (ans + mod) % mod;
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  // freopen( "input.txt" , "r" , stdin );
  // freopen( "output.txt" , "w" , stdout );

  int cghf = 1; // cin >> cghf;
  while (cghf--) {
    solve1();
  }
}