Problem p02616 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int mod = 1e9 + 7;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int n, k;
  cin >> n >> k;
  vector<pair<int, int>> v;
  bool ok = false;
  int cnt_zero = 0;
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    ok |= (a > 0);
    if (a > 0)
      v.push_back({a, 1});
    else if (a < 0)
      v.push_back({-a, -1});
    else
      cnt_zero++;
  }

  if (n - cnt_zero < k) {
    cout << 0 << '\n';
    return 0;
  }

  sort(v.begin(), v.end(), greater<pair<int, int>>());

  int cnt = 0;
  for (int i = 0; i < k; i++) {
    cnt += (v[i].second == -1);
  }

  if (!ok && k & 1) {
    // number is -ve.
    if (cnt_zero)
      cout << 0 << '\n';
    else {
      reverse(v.begin(), v.end());
      ll ans = 1;
      for (int i = 0; i < k; i++)
        ans = (ans * v[i].first) % mod;
      ans = mod - ans;

      cout << ans << '\n';
    }
  } else {
    // number is +ve.
    if (cnt & 1) {
      int idx_last_neg = -1, idx_last_pos = -1;
      for (int i = 0; i < k; i++) {
        if (v[i].second == 1)
          idx_last_pos = i;
        else
          idx_last_neg = i;
      }

      if (idx_last_pos == -1) {
        // k is odd, and +ve number is ahead.
        for (int i = k; i < n; i++) {
          if (v[i].second == 1) {
            swap(v[i], v[idx_last_neg]);
            ok = false;
            break;
          }
        }
      } else {
        int i = -1, j = -1;
        for (int p = k; p < n; p++) {
          if (v[p].second == -1 && j == -1)
            j = p;
          if (v[p].second == 1 && i == -1)
            i = p;
        }

        if (i == -1)
          swap(v[j], v[idx_last_pos]);
        else if (j == -1)
          swap(v[i], v[idx_last_neg]);
        else {
          if ((ll)v[i].first * v[idx_last_pos].first >
              (ll)v[j].first * v[idx_last_neg].first)
            swap(v[i], v[idx_last_neg]);
          else
            swap(v[j], v[idx_last_pos]);
        }
      }
    }

    ll ans = 1;
    for (int i = 0; i < k; i++)
      ans = (ans * v[i].first) % mod;
    cout << ans << '\n';
  }
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;

const int mod = 1e9 + 7;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int n, k;
  cin >> n >> k;
  vector<pair<int, int>> v;
  bool ok = false;
  int cnt_zero = 0;
  for (int i = 0; i < n; i++) {
    int a;
    cin >> a;
    ok |= (a > 0);
    if (a > 0)
      v.push_back({a, 1});
    else if (a < 0)
      v.push_back({-a, -1});
    else
      cnt_zero++;
  }

  if (n - cnt_zero < k) {
    cout << 0 << '\n';
    return 0;
  }

  sort(v.begin(), v.end(), greater<pair<int, int>>());

  int cnt = 0;
  for (int i = 0; i < k; i++) {
    cnt += (v[i].second == -1);
  }

  if (!ok && k & 1) {
    // number is -ve.
    if (cnt_zero)
      cout << 0 << '\n';
    else {
      reverse(v.begin(), v.end());
      ll ans = 1;
      for (int i = 0; i < k; i++)
        ans = (ans * v[i].first) % mod;
      ans = mod - ans;

      cout << ans << '\n';
    }
  } else {
    // number is +ve.
    if (cnt & 1) {
      int idx_last_neg = -1, idx_last_pos = -1;
      for (int i = 0; i < k; i++) {
        if (v[i].second == 1)
          idx_last_pos = i;
        else
          idx_last_neg = i;
      }

      if (idx_last_pos == -1) {
        // k is odd, and +ve number is ahead.
        for (int i = k; i < n; i++) {
          if (v[i].second == 1) {
            swap(v[i], v[idx_last_neg]);
            ok = false;
            break;
          }
        }
      } else if (k == n) {
        ll ans = 1;
        for (int i = 0; i < k; i++)
          ans = (ans * v[i].first) % mod;
        ans = mod - ans;
        cout << ans << '\n';
        return 0;
      } else {
        int i = -1, j = -1;
        for (int p = k; p < n; p++) {
          if (v[p].second == -1 && j == -1)
            j = p;
          if (v[p].second == 1 && i == -1)
            i = p;
        }

        if (i == -1)
          swap(v[j], v[idx_last_pos]);
        else if (j == -1)
          swap(v[i], v[idx_last_neg]);
        else {
          if ((ll)v[i].first * v[idx_last_pos].first >
              (ll)v[j].first * v[idx_last_neg].first)
            swap(v[i], v[idx_last_neg]);
          else
            swap(v[j], v[idx_last_pos]);
        }
      }
    }

    ll ans = 1;
    for (int i = 0; i < k; i++)
      ans = (ans * v[i].first) % mod;
    cout << ans << '\n';
  }
}