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

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

long long MOD = 1000000007;

int main() {
  long long N, K;
  cin >> N >> K;
  long long A;
  vector<long long> po, ne;
  long long i, j, k;
  for (k = 0; k < N; k++) {
    cin >> A;
    if (A >= 0) {
      po.push_back(A);
    } else if (A < 0) {
      ne.push_back(-A);
    }
  }
  sort(po.begin(), po.end());
  sort(ne.begin(), ne.end());
  long long ans = 1;
  if (N == K) {
    for (i = 0; i < po.size(); i++) {
      ans *= po[i];
      ans %= MOD;
    }
    for (j = 0; j < ne.size(); j++) {
      ans *= MOD - ne[j];
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  if ((ne.size() == N) && (K % 2 == 1)) {
    for (j = 0; j < K; j++) {
      ans *= MOD - ne[j];
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  i = po.size() - 1;
  j = ne.size() - 1;
  for (k = 0; k < K; k++) {
    if (k == K - 1) {
      ans *= po[i];
      ans %= MOD;
      i--;
    } else if (i >= 1 && j >= 1) {
      if (po[i] * po[i - 1] > ne[j] * ne[j - 1]) {
        ans *= po[i];
        ans %= MOD;
        i--;
      } else {
        ans *= MOD - ne[j];
        ans %= MOD;
        ans *= MOD - ne[j - 1];
        ans %= MOD;
        j--;
        j--;
        k++;
      }
    } else if (j <= 0) {
      ans *= po[i];
      ans %= MOD;
      i--;
    } else if ((K - k) % 2 == 1) {
      ans *= po[i];
      ans %= MOD;
      i--;
    } else {
      ans *= MOD - ne[j];
      ans %= MOD;
      ans *= MOD - ne[j - 1];
      ans %= MOD;
      j--;
      j--;
      k++;
    }
  }
  cout << ans << endl;
  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;

long long MOD = 1000000007;

int main() {
  long long N, K;
  cin >> N >> K;
  long long A;
  long long i, j, k;
  vector<long long> po, ne;
  long long ze = 0;
  for (i = 0; i < N; i++) {
    cin >> A;
    if (A > 0) {
      po.push_back(A);
    } else if (A < 0) {
      ne.push_back(-A);
    } else {
      ze++;
    }
  }
  sort(po.begin(), po.end());
  sort(ne.begin(), ne.end());
  long long ans = 1;
  if ((po.size() + ne.size() == K) && (ne.size() % 2 == 0)) {
    for (i = 0; i < po.size(); i++) {
      ans *= po[i];
      ans %= MOD;
    }
    for (j = 0; j < ne.size(); j++) {
      ans *= MOD - ne[j];
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  } else if ((po.size() + ne.size() > K) && (po.size() > 0) &&
             (ne.size() > 0)) {
    if (po.size() == 1) {
      if (K % 2 == 1) {
        ans = po[0];
        j = ne.size() - 1;
        for (k = 0; k < K - 1; k++) {
          ans *= ne[j];
          ans %= MOD;
          j--;
        }
        cout << ans << endl;
        return 0;
      } else {
        j = ne.size() - 1;
        for (k = 0; k < K; k++) {
          ans *= ne[j];
          ans %= MOD;
          j--;
        }
        cout << ans << endl;
        return 0;
      }
    } else if (ne.size() == 1) {
      i = po.size() - 1;
      for (k = 0; k < K; k++) {
        ans *= po[i];
        ans %= MOD;
        i--;
      }
      cout << ans << endl;
      return 0;
    } else {
      vector<pair<long long, long long>> vec;
      for (i = 0; i < po.size(); i++) {
        vec.push_back(make_pair(-po[i], 0));
      }
      for (j = 0; j < ne.size(); j++) {
        vec.push_back(make_pair(-ne[j], 1));
      }
      sort(vec.begin(), vec.end());
      long long poco = 0, neco = 0;
      for (k = 0; k < K; k++) {
        if (vec[k].second == 0) {
          poco++;
        } else {
          neco++;
        }
      }
      if (neco % 2 == 0) {
        i = po.size() - 1;
        for (k = 0; k < poco; k++) {
          ans *= po[i];
          ans %= MOD;
          i--;
        }
        j = ne.size() - 1;
        for (k = 0; k < neco; k++) {
          ans *= MOD - ne[j];
          ans %= MOD;
          j--;
        }
        cout << ans << endl;
        return 0;
      } else {
        if (poco == 0 || neco == ne.size()) {
          poco++;
          neco--;
          i = po.size() - 1;
          for (k = 0; k < poco; k++) {
            ans *= po[i];
            ans %= MOD;
            i--;
          }
          j = ne.size() - 1;
          for (k = 0; k < neco; k++) {
            ans *= MOD - ne[j];
            ans %= MOD;
            j--;
          }
          cout << ans << endl;
          return 0;
        } else if (poco == po.size() || neco == 0) {
          poco--;
          neco++;
          i = po.size() - 1;
          for (k = 0; k < poco; k++) {
            ans *= po[i];
            ans %= MOD;
            i--;
          }
          j = ne.size() - 1;
          for (k = 0; k < neco; k++) {
            ans *= MOD - ne[j];
            ans %= MOD;
            j--;
          }
          cout << ans << endl;
          return 0;
        } else {
          assert(0);
          long long val = 1, val2 = 1;
          for (k = 0; k < poco + 1; k++) {
            if (k == poco - 1 || k == poco) {
              val *= po[i];
            }
            i--;
          }
          j = ne.size() - 1;
          for (k = 0; k < neco + 1; k++) {
            if (k == neco - 1 || k == neco) {
              val2 *= ne[j];
            }
            j--;
          }
          if (val >= val2) {
            poco++;
            neco--;
            i = po.size() - 1;
            for (k = 0; k < poco; k++) {
              ans *= po[i];
              ans %= MOD;
              i--;
            }
            j = ne.size() - 1;
            for (k = 0; k < neco; k++) {
              ans *= MOD - ne[j];
              ans %= MOD;
              j--;
            }
            cout << ans << endl;
            return 0;
          } else {
            poco--;
            neco++;
            i = po.size() - 1;
            for (k = 0; k < poco; k++) {
              ans *= po[i];
              ans %= MOD;
              i--;
            }
            j = ne.size() - 1;
            for (k = 0; k < neco; k++) {
              ans *= MOD - ne[j];
              ans %= MOD;
              j--;
            }
            cout << ans << endl;
            return 0;
          }
        }
      }
    }
  } else if (po.size() + ne.size() < K) {
    cout << 0 << endl;
    return 0;
  } else if ((po.size() + ne.size() == K) && (ne.size() % 2 == 1) && (ze > 0)) {
    cout << 0 << endl;
    return 0;
  } else if ((po.size() + ne.size() == K) && (ne.size() % 2 == 1) &&
             (ze == 0)) {
    for (i = 0; i < po.size(); i++) {
      ans *= po[i];
      ans %= MOD;
    }
    for (j = 0; j < ne.size(); j++) {
      ans *= MOD - ne[j];
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  } else if ((po.size() + ne.size() > K) && (po.size() == 0) && (K % 2 == 0)) {
    j = ne.size() - 1;
    for (k = 0; k < K; k++) {
      ans *= MOD - ne[j];
      ans %= MOD;
      j--;
    }
    cout << ans << endl;
    return 0;
  } else if ((po.size() + ne.size() > K) && (po.size() == 0) && (K % 2 == 1) &&
             (ze > 0)) {
    cout << 0 << endl;
    return 0;
  } else if ((po.size() + ne.size() > K) && (po.size() == 0) && (K % 2 == 1) &&
             (ze == 0)) {
    for (j = 0; j < K; j++) {
      ans *= MOD - ne[j];
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  } else if ((po.size() + ne.size() > K) && (ne.size() == 0)) {
    i = po.size() - 1;
    for (k = 0; k < K; k++) {
      ans *= po[i];
      ans %= MOD;
      i--;
    }
    cout << ans << endl;
    return 0;
  } else {
    assert(0);
    // fuyou na yotei
  }
  system("pause");
  return 0;
}