Problem p02616 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
const long long MOD = 1e9 + 7;
const long double Pi = acos(-1);
using P = pair<ll, ll>;
ll gcd(ll a, ll b) { // aとbの最大公約数を返す//計算量は0(log(max(a,b))
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
ll lcm(ll a, ll b) { // aとbの最小公倍数を返す//計算量は0(log(max(a,b))
  return a * b / gcd(a, b);
}
ll pow(ll x, ll y) { // x^yを返す//計算量は0(log(y))
  ll tmp = x, res = 1;
  while (y) {
    if (y % 2) {
      res = res * tmp % MOD;
    }
    y >>= 1;
    tmp = tmp * tmp % MOD;
  }
  return res;
}
ll nature(ll a) { // 絶対値を返す
  if (a >= 0) {
    return (a);
  } else {
    return (-1 * a);
  }
}
ll prime(ll a) { // 素数なら1を返す//計算量は0(sqrt(a))
  if (a == 2) {
    return 1;
  } else if (a % 2 == 0 || a == 1) {
    return 0;
  }
  for (ll i = 3; i * i <= a; i += 2) {
    if (a % i == 0) {
      return 0;
    }
  }
  return 1;
}
int main() {
  ll N, K, a, ans = 1;
  cin >> N >> K;
  vector<ll> A(0);
  vector<ll> B(0);
  for (ll i = 0; i < N; i++) {
    cin >> a;
    if (a >= 0) {
      A.push_back(a);
    } else {
      B.push_back(a);
    }
  }
  sort(A.begin(), A.end());
  reverse(A.begin(), A.end());
  sort(B.begin(), B.end());
  ll x = 0;
  ll y = 0;
  // cout<<A.size()<<" "<<B.size()<<endl;
  if (B.size() == 0) {
    for (int i = 0; i < K; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  if (A.size() == 0) {
    if (K % 2 == 1) {
      for (int i = 0; i < K; i++) {
        ans *= B.at((ll)B.size() - i - 1);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
    } else {
      for (int i = 0; i < K; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
    }
    cout << ans << endl;
    return 0;
  }
  if (N == K + 1) {
    if ((int)B.size() % 2 == 1) {
      for (int i = 0; i < (ll)A.size(); i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < (ll)B.size() - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      for (int i = 0; i < (ll)A.size() - 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < (ll)B.size(); i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
  }
  if (N == K) {
    for (int i = 0; i < (ll)A.size(); i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    for (int i = 0; i < (ll)B.size(); i++) {
      ans *= B.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  /*
  int bb=max((ll)0,K-(ll)A.size()+(K-(ll)A.size())%2);
  for(int i=0;i<K-bb;i++){
    ans*=A.at(i);
    ans%=MOD;
    ans+=MOD;
    ans%=MOD;
  }
  for(int i=0;i<bb;i++){
    ans*=B.at(i);
    ans%=MOD;
    ans+=MOD;
    ans%=MOD;
  }
  */
  for (int i = 0; i < K; i++) {
    if (x == (ll)A.size()) {
      y++;
      continue;
    }
    if (y == (ll)B.size()) {
      x++;
      continue;
    }
    if (A.at(x) >= -1 * B.at(y)) {
      x++;
    } else {
      y++;
    }
  }
  if (x == 0) {
    if (y % 2 == 0) {
      for (int i = 0; i < y; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      ans = A.at(0);
      for (int i = 0; i < y - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
  }
  if (y == 0) {
    for (int i = 0; i < x; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  if (y % 2 == 0) {
    for (int i = 0; i < x; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    for (int i = 0; i < y; i++) {
      ans *= B.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  } else {
    if (x == (ll)A.size()) {
      for (int i = 0; i < x - 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y + 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
    if (y == (ll)B.size()) {
      for (int i = 0; i < x + 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
    if (A.at(x) * A.at(x - 1) >= B.at(x) * B.at(x - 1)) {

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

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
const long long MOD = 1e9 + 7;
const long double Pi = acos(-1);
using P = pair<ll, ll>;
ll gcd(ll a, ll b) { // aとbの最大公約数を返す//計算量は0(log(max(a,b))
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
ll lcm(ll a, ll b) { // aとbの最小公倍数を返す//計算量は0(log(max(a,b))
  return a * b / gcd(a, b);
}
ll pow(ll x, ll y) { // x^yを返す//計算量は0(log(y))
  ll tmp = x, res = 1;
  while (y) {
    if (y % 2) {
      res = res * tmp % MOD;
    }
    y >>= 1;
    tmp = tmp * tmp % MOD;
  }
  return res;
}
ll nature(ll a) { // 絶対値を返す
  if (a >= 0) {
    return (a);
  } else {
    return (-1 * a);
  }
}
ll prime(ll a) { // 素数なら1を返す//計算量は0(sqrt(a))
  if (a == 2) {
    return 1;
  } else if (a % 2 == 0 || a == 1) {
    return 0;
  }
  for (ll i = 3; i * i <= a; i += 2) {
    if (a % i == 0) {
      return 0;
    }
  }
  return 1;
}
int main() {
  ll N, K, a, ans = 1;
  cin >> N >> K;
  vector<ll> A(0);
  vector<ll> B(0);
  for (ll i = 0; i < N; i++) {
    cin >> a;
    if (a >= 0) {
      A.push_back(a);
    } else {
      B.push_back(a);
    }
  }
  sort(A.begin(), A.end());
  reverse(A.begin(), A.end());
  sort(B.begin(), B.end());
  ll x = 0;
  ll y = 0;
  // cout<<A.size()<<" "<<B.size()<<endl;
  if (B.size() == 0) {
    for (int i = 0; i < K; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  if (A.size() == 0) {
    if (K % 2 == 1) {
      for (int i = 0; i < K; i++) {
        ans *= B.at((ll)B.size() - i - 1);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
    } else {
      for (int i = 0; i < K; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
    }
    cout << ans << endl;
    return 0;
  }
  if (N == K + 1) {
    if ((int)B.size() % 2 == 1) {
      for (int i = 0; i < (ll)A.size(); i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < (ll)B.size() - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      for (int i = 0; i < (ll)A.size() - 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < (ll)B.size(); i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
  }
  if (N == K) {
    for (int i = 0; i < (ll)A.size(); i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    for (int i = 0; i < (ll)B.size(); i++) {
      ans *= B.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  /*
  int bb=max((ll)0,K-(ll)A.size()+(K-(ll)A.size())%2);
  for(int i=0;i<K-bb;i++){
    ans*=A.at(i);
    ans%=MOD;
    ans+=MOD;
    ans%=MOD;
  }
  for(int i=0;i<bb;i++){
    ans*=B.at(i);
    ans%=MOD;
    ans+=MOD;
    ans%=MOD;
  }
  */
  for (int i = 0; i < K; i++) {
    if (x == (ll)A.size()) {
      y++;
      continue;
    }
    if (y == (ll)B.size()) {
      x++;
      continue;
    }
    if (A.at(x) >= -1 * B.at(y)) {
      x++;
    } else {
      y++;
    }
  }
  if (x == 0) {
    if (y % 2 == 0) {
      for (int i = 0; i < y; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      ans = A.at(0);
      for (int i = 0; i < y - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
  }
  if (y == 0) {
    for (int i = 0; i < x; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  }
  if (y % 2 == 0) {
    for (int i = 0; i < x; i++) {
      ans *= A.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    for (int i = 0; i < y; i++) {
      ans *= B.at(i);
      ans %= MOD;
      ans += MOD;
      ans %= MOD;
    }
    cout << ans << endl;
    return 0;
  } else {
    if (x == (ll)A.size()) {
      for (int i = 0; i < x - 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y + 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
    if (y == (ll)B.size()) {
      for (int i = 0; i < x + 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
    if (A.at(x) * A.at(x - 1) >= B.at(y) * B.at(y - 1)) {
      for (int i = 0; i < x + 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y - 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    } else {
      for (int i = 0; i < x - 1; i++) {
        ans *= A.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      for (int i = 0; i < y + 1; i++) {
        ans *= B.at(i);
        ans %= MOD;
        ans += MOD;
        ans %= MOD;
      }
      cout << ans << endl;
      return 0;
    }
  }
}