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

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define oo 0x3f3f3f3f

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  vector<array<ll, 2>> A;
  int posCnt = 0;
  int mx = -1e9 - 1;

  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    mx = max(mx, x);
    posCnt += x >= 0;
    A.push_back({abs(x), x < 0 ? -1 : x == 0 ? 0 : 1});
  }
  sort(A.rbegin(), A.rend());

  ll res = 1;
  ll mod = 1e9 + 7;

  if (k == 1)
    return cout << (mx + mod) % mod, 0;

  if (posCnt == 0 || k == n) // all negative
  {
    res = 1;
    if (k & 1)
      reverse(A.begin(), A.end());
    for (int i = 0; i < k; i++)
      res = (res * (A[i][0] * A[i][1])) % mod;
    if (res < 0)
      res += mod;
    return cout << res, 0;
  }

  int cnt = 0;

  ll lastNeg = 1;
  ll lastPos = 1;
  ll wasPos = 0;

  for (int i = 0; i < k; i++)
    if (A[i][1] < 0) {
      res = (res * lastNeg) % mod;
      lastNeg = -A[i][0], cnt++;
    } else {
      res = (res * lastPos) % mod;
      lastPos = A[i][0];
      wasPos = 1;
    }

  if (!wasPos && cnt % 2 == 1) // special case?
  {
    ll nxtPos = -1;

    for (int i = k; i < n; i++)
      if (A[i][1] >= 0) {
        nxtPos = A[i][0];
        break;
      }
    res = (res * lastPos) % mod;
    res = (res * nxtPos) % mod;
  } else if (cnt & 1) // gotta get rid of minus
  {
    ll nxtNeg = 1;
    ll nxtPos = -1;

    for (int i = k; i < n; i++)
      if (A[i][1] < 0) {
        nxtNeg = -A[i][0];
        break;
      }

    for (int i = k; i < n; i++)
      if (A[i][1] >= 0) {
        nxtPos = A[i][0];
        break;
      }

    // case 1: get rid of lastPositive and add nxtNeg instead
    // case 2: get rid of lastNegative and add nxtPos instead

    if (nxtNeg < 0 && nxtPos >= 0) {
      if (lastNeg * nxtNeg >= lastPos * nxtPos) {
        res = (res * lastNeg) % mod;
        res = (res * nxtNeg) % mod;
      } else {
        res = (res * lastPos) % mod;
        res = (res * nxtPos) % mod;
      }
    } else if (nxtNeg < 0) {
      res = (res * lastNeg) % mod;
      res = (res * nxtNeg) % mod;
    } else if (nxtPos >= 0) {
      res = (res * lastPos) % mod;
      res = (res * nxtPos) % mod;
    } else
      return SIGSEGV;
  } else {
    res = (res * lastPos) % mod;
    res = (res * lastNeg) % mod;
  }

  if (res < 0)
    res += mod;

  cout << res;
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define oo 0x3f3f3f3f

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  vector<array<ll, 2>> A;
  int posCnt = 0;
  int mx = -1e9 - 1;

  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    mx = max(mx, x);
    posCnt += x >= 0;
    A.push_back({abs(x), x < 0 ? -1 : x == 0 ? 0 : 1});
  }
  sort(A.rbegin(), A.rend());

  ll res = 1;
  ll mod = 1e9 + 7;

  if (k == 1)
    return cout << (mx + mod) % mod, 0;

  if (posCnt == 0 || k == n) // all negative
  {
    return SIGSEGV;
    res = 1;
    if (k & 1)
      reverse(A.begin(), A.end());
    for (int i = 0; i < k; i++)
      res = (res * (-A[i][0])) % mod;
    if (res < 0)
      res += mod;
    return cout << res, 0;
  }

  int cnt = 0;

  ll lastNeg = 1;
  ll lastPos = 1;
  ll wasPos = 0;

  for (int i = 0; i < k; i++)
    if (A[i][1] < 0) {
      res = (res * lastNeg) % mod;
      lastNeg = -A[i][0], cnt++;
    } else {
      res = (res * lastPos) % mod;
      lastPos = A[i][0];
      wasPos = 1;
    }

  if (!wasPos && cnt % 2 == 1) // special case?
  {
    ll nxtPos = -1;

    for (int i = k; i < n; i++)
      if (A[i][1] >= 0) {
        nxtPos = A[i][0];
        break;
      }
    res = (res * lastPos) % mod;
    res = (res * nxtPos) % mod;
  } else if (cnt & 1) // gotta get rid of minus
  {
    ll nxtNeg = 1;
    ll nxtPos = -1;

    for (int i = k; i < n; i++)
      if (A[i][1] < 0) {
        nxtNeg = -A[i][0];
        break;
      }

    for (int i = k; i < n; i++)
      if (A[i][1] >= 0) {
        nxtPos = A[i][0];
        break;
      }

    // case 1: get rid of lastPositive and add nxtNeg instead
    // case 2: get rid of lastNegative and add nxtPos instead

    if (nxtNeg < 0 && nxtPos >= 0) {
      if (lastNeg * nxtNeg >= lastPos * nxtPos) {
        res = (res * lastNeg) % mod;
        res = (res * nxtNeg) % mod;
      } else {
        res = (res * lastPos) % mod;
        res = (res * nxtPos) % mod;
      }
    } else if (nxtNeg < 0) {
      res = (res * lastNeg) % mod;
      res = (res * nxtNeg) % mod;
    } else if (nxtPos >= 0) {
      res = (res * lastPos) % mod;
      res = (res * nxtPos) % mod;
    } else
      return SIGSEGV;
  } else {
    res = (res * lastPos) % mod;
    res = (res * lastNeg) % mod;
  }

  if (res < 0)
    res += mod;

  cout << res;
}