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

#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int N, K;
long long int A[200005];

vector<long long int> P;
vector<long long int> M;

long long int MOD = 1000000007;

int main(void) {

  // ifstream ifs("random_max01.txt");

  cin >> N >> K;
  for (int i = 1; i <= N; i++) {
    cin >> A[i];

    if (A[i] >= 0) {
      P.push_back(A[i]);
    } else {
      M.push_back(A[i]);
    }
  }

  sort(P.rbegin(), P.rend());
  sort(M.begin(), M.end());

  long long int ans = 1;

  if (K == N) {
    for (int i = 1; i <= N; i++) {
      ans *= abs(A[i]);
      ans %= MOD;
    }

    if (M.size() % 2 == 1) {
      ans = (MOD - ans) % MOD;
    }

    cout << ans << endl;
    return 0;
  }

  if (P.size() == 0) {
    if (K % 2 == 0) {
      sort(M.begin(), M.end());

      for (int i = 0; i < K; i++) {
        ans *= abs(M[i]);
        ans %= MOD;
      }

    } else {
      sort(M.rbegin(), M.rend());

      for (int i = 0; i < K; i++) {
        ans *= abs(M[i]);
        ans %= MOD;
      }

      // cout << "ans= " << ans << endl;

      ans = (MOD - ans) % MOD;
    }
  } else {

    int cnt = 0;

    int p = 0;
    int q = 0;
    if (K % 2 == 1) {
      ans *= P[0];
      cnt++;
      p++;
    }

    while (1) {

      if (K == cnt) {
        break;
      }
      /*else if (q==(int)M.size()-1) {
              ans *= P[p]; ans %= MOD; p++; cnt++;
      }
      else if (p==(int)P.size()-1) {
              ans *= abs(M[q]); ans %= MOD; q++; cnt++;
      }*/
      else {

        if (p >= (int)P.size() - 1) {

          ans *= abs(M[q]);
          ans %= MOD;
          q++;
          cnt++;
          ans *= abs(M[q]);
          ans %= MOD;
          q++;
          cnt++;
        } else if (q >= (int)M.size() - 1) {

          ans *= P[p];
          ans %= MOD;
          p++;
          cnt++;
          ans *= P[p];
          ans %= MOD;
          p++;
          cnt++;
        } else {

          if (M[q] * M[q + 1] >= P[p] * P[p + 1]) {
            ans *= abs(M[q]);
            ans %= MOD;
            q++;
            cnt++;
            ans *= abs(M[q]);
            ans %= MOD;
            q++;
            cnt++;
          } else {
            ans *= P[p];
            ans %= MOD;
            p++;
            cnt++;
            ans *= P[p];
            ans %= MOD;
            p++;
            cnt++;
          }
        }
      }
    }
  }

  cout << ans << endl;

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int N, K;
long long int A[200005];

vector<long long int> P;
vector<long long int> M;

long long int MOD = 1000000007;

int main(void) {

  cin >> N >> K;
  for (int i = 1; i <= N; i++) {
    cin >> A[i];

    if (A[i] >= 0) {
      P.push_back(A[i]);
    } else {
      M.push_back(A[i]);
    }
  }

  sort(P.rbegin(), P.rend());
  sort(M.begin(), M.end());

  long long int ans = 1;

  if (P.size() == 0) {
    if (K % 2 == 0) {
      sort(M.rbegin(), M.rend());

      for (int i = 0; i < K; i++) {
        ans *= abs(M[i]);
        ans %= MOD;
      }

    } else {
      sort(M.begin(), M.end());

      for (int i = 0; i < K; i++) {
        ans *= abs(M[i]);
        ans %= MOD;
      }

      ans = MOD - ans;
    }
  } else {

    int cnt = 0;

    int p = 0;
    int q = 0;
    if (K % 2 == 1) {
      ans *= P[0];
      cnt++;
      p++;
    }

    while (1) {

      if (K == cnt) {
        break;
      } else if (cnt == K - 1) {
        ans *= P[p];
        ans %= MOD;
        p++;
        break;
      } else {

        if (p == P.size() - 1) {
          ans *= abs(M[q]);
          ans %= MOD;
          q++;
          cnt++;
          ans *= abs(M[q]);
          ans %= MOD;
          q++;
          cnt++;
        } else if (q == M.size() - 1) {
          ans *= P[p];
          ans %= MOD;
          p++;
          cnt++;
          ans *= P[p];
          ans %= MOD;
          p++;
          cnt++;
        } else {
          if (M[q] * M[q + 1] > P[p] * P[p + 1]) {
            ans *= abs(M[q]);
            ans %= MOD;
            q++;
            cnt++;
            ans *= abs(M[q]);
            ans %= MOD;
            q++;
            cnt++;
          } else {
            ans *= P[p];
            ans %= MOD;
            p++;
            cnt++;
            ans *= P[p];
            ans %= MOD;
            p++;
            cnt++;
          }
        }
      }
    }
  }

  cout << ans << endl;

  return 0;
}