Problem p02616 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdlib>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

/*
　　　　　　　　　　　　　　　　　　　　　__,.二ﾆ==-　　ﾆ．、_.　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　　　.,.．‐　⌒　　　　　　　　　　　　｀`'ァ-ﾆ、.　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　ィ'´.　　　　　　　　　　　　　　　　　　　　　　´丶.、　　　　　　　　　　　　
　　　　　　　　　　　.,ィ'´　　　　　　　　　　　　　　　　　　　　　　　　　　　　`.ｘ、..　　　　　　　　　
　..　　　　　　　　／.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　､＼.　　　　　　　　
　　　　　　　　.ﾝ′.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　￢`""冖ｰミト．
　　　　　　　,ｒ′.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.ﾍ、　　　　`
　　　　　　ﾂ　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　`、....　　　
　　　　　./´　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　ﾍ　　　　
　.....　　/.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.〉.　　　
　　　´/..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.ｌ　　　
　　　ｨ　　　　　　　　　　　　　　　　　　　　　　　　　．　　　　　　　　　　　　　　　　　　　　　ｆ..　　
　..　.ｆ　,d.　　　　　　　　　　　　　　　　　l　　　′　」　　,.　　　　　　　　　　　　　ﾄ　　　　　！　　
　.　〕../.ｆ..　　　　　　　　　　　　　　　　　′　．.　　|　　.｝　　　　　　　　　　　　　|　　　　　　|.　　
　　.!./..f..　　　　　　　　　　　　　　　　　/　　!－　ナ丶п冖т　　　　ﾉｰ-　．　〕　　　　　　|.　　
　　|ﾒ　|　　　　　　　　　　　　　　　｜　j　　　　　　,　　┌．　|〈.　　　л`.　　　/|..　　　　　┤,..　
　...「...｜.　　　　　　|　　´　　　　　　l.　|　　j.Ｌ......ｭ.Ｌ＿└ヽ_｜Y.　　ﾒムｗ　ょ　|　　j.:　　　|　￣
　.　　｜.　　　　　　　　　　　　　　　т〕＜.ィ冖T冖..　г‐　`､　`,　/┴￢..г￣|..　.′　　｜　　
　...　　|　　　　　　　　．..　　　　　　　),|..　｀　　ﾘ　「_ﾉ.||　　　　`　V　　|!｛,｢ll　´.」.　　　　　卜　　
　.　　｜.」　　　　　　′　　　　　　　　ヽ　　　　└++〃..　　　　　　　　ﾙｗｆ　　ｶz′.　　　｜.　　
　　　　|..〕　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　｢　　　　　．|　　　
　　　　.ｌ.|.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　′.　　　　　|　　　
　.　　　.〕..　　　　　　　　　　　　　　　`!　　　　　　　　_...．.ｰ：''　　　　　　　　　｣　´　　　　λ.　　
　　　　_｢.　　　　,　　　　　　　　　　　　┐_,、｀~‐''"´　　　　　　　　　　　　　　　　ィ　　　.､　ﾍ、　
　　　　ｆ　　　　　　:_＿..,二ュ．-i―'''^~´　　　　　　　　　　　　　　　　　　　　　　　､＼イ　ヘ．`ｘ
　.　　/　　　　　　｛　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　j　　　　.~^
　　､/　　　　　　　'ｔ..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　丿..　　　　　
　.../.　　　　　　　,x┐..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　∠∫　　　　　
　:^.　　　　　　　/　　￣冖ー=zzｭ┌ｰ―--　　　∟,二...＿.　　　　　　　_,､．-ｰ.'l+~.　.l｀．　　　　
　.　　　　　　　У.　　　　　　　　　⌒冖‐-=．_..　l｢.｢　　　　　　´￣｣了　　.,､-''＾　　　〉　ヽ_　　　
　　　　　　　_/.　　　　　　　　　　　　　　　　　　￣~'.ー-=．、＿,..usｧ.ｰ''"　　　　　　｛　　　＼´　
　　　　　　_ヰl'￢―-　､_　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（　　　　.＼
*/

using namespace std;

using ll = long long int;
using ull = unsigned long long int;

ll const MOD = 1000000007;
ll const INF = (long long int)1 << 61;

ll mypow(ll x, ll n, ll mod = MOD) {
  ll ret = 1;
  while (n > 0) {
    if (n & 1) {
      ret = (ret * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return ret;
}

ll mygcd(ll a, ll b) {
  if (b == 0)
    return a;
  return mygcd(b, a % b);
}

ll twoPow(ll shiftNum) { return (1LL << (shiftNum - 1)); }

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

  ll n, k;
  cin >> n >> k;

  vector<ll> a(n);
  for (auto &x : a) {
    cin >> x;
  }

  ll mnum = 0;
  ll pnum = 0;
  ll zero = 0;
  vector<pair<ll, bool>> b;
  vector<ll> m;
  vector<ll> p;
  for (int i = 0; i < n; i++) {
    if (a[i] < 0) {
      mnum++;
      b.push_back({-a[i], false});
      m.push_back(a[i]);
    } else if (a[i] == 0) {
      zero++;
      b.push_back({0, true});
    } else {
      pnum++;
      b.push_back({a[i], true});
      p.push_back(a[i]);
    }
  }

  sort(b.begin(), b.end(), greater<pair<ll, bool>>());
  sort(m.begin(), m.end());
  sort(p.begin(), p.end(), greater<ll>());

  if (pnum == 0 && k % 2 != 0) {
    if (zero > 0) {
      cout << 0 << endl;
      return 0;
    } else {
      ll ans = 1;
      ll num = 0;
      for (int i = n - 1; i >= 0; i--) {
        if (num == k) {
          break;
        }
        if (b[i].second) {
          ans *= b[i].first;
          ans %= MOD;
        } else {
          ans *= (MOD - b[i].first);
          ans %= MOD;
        }
        num++;
      }
      cout << ans << endl;
    }
  } else if (pnum + mnum < k) {
    cout << 0 << endl;
    return 0;
  } else if (pnum + mnum == k) {
    if (mnum % 2 == 0) {
      ll ans = 1;
      ll num = 0;
      for (int i = 0; i < n; i++) {
        if (num == k) {
          break;
        }
        if (b[i].second) {
          ans *= b[i].first;
          ans %= MOD;
        } else {
          ans *= (MOD - b[i].first);
          ans %= MOD;
        }
        num++;
      }
      cout << ans << endl;
    } else {
      if (zero > 0) {
        cout << 0 << endl;
        return 0;
      } else {
        ll ans = 1;
        ll num = 0;
        for (int i = n - 1; i >= 0; i--) {
          if (num == k) {
            break;
          }
          if (!b[i].second) {
            ans *= (MOD - b[i].first);
            ans %= MOD;
          } else {
            ans *= b[i].first;
            ans %= MOD;
          }
          num++;
        }
        cout << ans << endl;
        return 0;
      }
    }
  } else {
    if (mnum % 2 == 0) {
      if (pnum % 2 != 0) {
        pnum--;
      }
      ll ans = 1;
      ll num = 0;
      ll mct = 0;
      ll pct = 0;
      while (true) {
        if (num == k) {
          break;
        }
        ll mtmp = -1;
        if (mct + 1 < m.size()) {
          mtmp = m[mct] * m[mct + 1];
        }
        ll ptmp = -1;
        if (pct + 1 < p.size()) {
          ptmp = p[pct] * p[pct + 1];
        }
        if (mtmp > ptmp) {
          mct += 2;
          ans *= (mtmp) % MOD;
          ans %= MOD;
        } else {
          pct += 2;
          ans *= (ptmp) % MOD;
          ans %= MOD;
        }
        num += 2;
      }
      cout << ans << endl;
      return 0;
    } else {
      ll num = 1;
      ll ans = p[0];
      ll mct = 0;
      ll pct = 1;
      while (true) {
        if (num == k) {
          break;
        }
        ll mtmp = -1;
        if (mct + 1 < m.size()) {
          mtmp = m[mct] * m[mct + 1];
        }
        ll ptmp = -1;
        if (pct + 1 < p.size()) {
          ptmp = p[pct] * p[pct + 1];
        }
        if (mtmp > ptmp) {
          mct += 2;
          ans *= mtmp % MOD;
          ans %= MOD;
        } else {
          pct += 2;
          ans *= ptmp % MOD;
          ans %= MOD;
        }
        num += 2;
      }
      cout << ans << endl;
      return 0;
    }
  }

  return 0;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdlib>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <vector>

/*
　　　　　　　　　　　　　　　　　　　　　__,.二ﾆ==-　　ﾆ．、_.　　　　　　　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　　　.,.．‐　⌒　　　　　　　　　　　　｀`'ァ-ﾆ、.　　　　　　　　　　　　　　　
　　　　　　　　　　　　　　ィ'´.　　　　　　　　　　　　　　　　　　　　　　´丶.、　　　　　　　　　　　　
　　　　　　　　　　　.,ィ'´　　　　　　　　　　　　　　　　　　　　　　　　　　　　`.ｘ、..　　　　　　　　　
　..　　　　　　　　／.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　､＼.　　　　　　　　
　　　　　　　　.ﾝ′.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　￢`""冖ｰミト．
　　　　　　　,ｒ′.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.ﾍ、　　　　`
　　　　　　ﾂ　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　`、....　　　
　　　　　./´　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　ﾍ　　　　
　.....　　/.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.〉.　　　
　　　´/..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　.ｌ　　　
　　　ｨ　　　　　　　　　　　　　　　　　　　　　　　　　．　　　　　　　　　　　　　　　　　　　　　ｆ..　　
　..　.ｆ　,d.　　　　　　　　　　　　　　　　　l　　　′　」　　,.　　　　　　　　　　　　　ﾄ　　　　　！　　
　.　〕../.ｆ..　　　　　　　　　　　　　　　　　′　．.　　|　　.｝　　　　　　　　　　　　　|　　　　　　|.　　
　　.!./..f..　　　　　　　　　　　　　　　　　/　　!－　ナ丶п冖т　　　　ﾉｰ-　．　〕　　　　　　|.　　
　　|ﾒ　|　　　　　　　　　　　　　　　｜　j　　　　　　,　　┌．　|〈.　　　л`.　　　/|..　　　　　┤,..　
　...「...｜.　　　　　　|　　´　　　　　　l.　|　　j.Ｌ......ｭ.Ｌ＿└ヽ_｜Y.　　ﾒムｗ　ょ　|　　j.:　　　|　￣
　.　　｜.　　　　　　　　　　　　　　　т〕＜.ィ冖T冖..　г‐　`､　`,　/┴￢..г￣|..　.′　　｜　　
　...　　|　　　　　　　　．..　　　　　　　),|..　｀　　ﾘ　「_ﾉ.||　　　　`　V　　|!｛,｢ll　´.」.　　　　　卜　　
　.　　｜.」　　　　　　′　　　　　　　　ヽ　　　　└++〃..　　　　　　　　ﾙｗｆ　　ｶz′.　　　｜.　　
　　　　|..〕　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　｢　　　　　．|　　　
　　　　.ｌ.|.　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　′.　　　　　|　　　
　.　　　.〕..　　　　　　　　　　　　　　　`!　　　　　　　　_...．.ｰ：''　　　　　　　　　｣　´　　　　λ.　　
　　　　_｢.　　　　,　　　　　　　　　　　　┐_,、｀~‐''"´　　　　　　　　　　　　　　　　ィ　　　.､　ﾍ、　
　　　　ｆ　　　　　　:_＿..,二ュ．-i―'''^~´　　　　　　　　　　　　　　　　　　　　　　　､＼イ　ヘ．`ｘ
　.　　/　　　　　　｛　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　j　　　　.~^
　　､/　　　　　　　'ｔ..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　丿..　　　　　
　.../.　　　　　　　,x┐..　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　∠∫　　　　　
　:^.　　　　　　　/　　￣冖ー=zzｭ┌ｰ―--　　　∟,二...＿.　　　　　　　_,､．-ｰ.'l+~.　.l｀．　　　　
　.　　　　　　　У.　　　　　　　　　⌒冖‐-=．_..　l｢.｢　　　　　　´￣｣了　　.,､-''＾　　　〉　ヽ_　　　
　　　　　　　_/.　　　　　　　　　　　　　　　　　　￣~'.ー-=．、＿,..usｧ.ｰ''"　　　　　　｛　　　＼´　
　　　　　　_ヰl'￢―-　､_　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　（　　　　.＼
*/

using namespace std;

using ll = long long int;
using ull = unsigned long long int;

ll const MOD = 1000000007;
ll const INF = (long long int)1 << 61;

ll mypow(ll x, ll n, ll mod = MOD) {
  ll ret = 1;
  while (n > 0) {
    if (n & 1) {
      ret = (ret * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return ret;
}

ll mygcd(ll a, ll b) {
  if (b == 0)
    return a;
  return mygcd(b, a % b);
}

ll twoPow(ll shiftNum) { return (1LL << (shiftNum - 1)); }

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

  ll n, k;
  cin >> n >> k;

  vector<ll> a(n);
  for (auto &x : a) {
    cin >> x;
  }

  ll mnum = 0;
  ll pnum = 0;
  ll zero = 0;
  vector<pair<ll, bool>> b;
  vector<ll> m;
  vector<ll> p;
  for (int i = 0; i < n; i++) {
    if (a[i] < 0) {
      mnum++;
      b.push_back({-a[i], false});
      m.push_back(a[i]);
    } else if (a[i] == 0) {
      zero++;
      b.push_back({0, true});
    } else {
      pnum++;
      b.push_back({a[i], true});
      p.push_back(a[i]);
    }
  }

  sort(b.begin(), b.end(), greater<pair<ll, bool>>());
  sort(m.begin(), m.end());
  sort(p.begin(), p.end(), greater<ll>());

  if (pnum == 0 && k % 2 != 0) {
    if (zero > 0) {
      cout << 0 << endl;
      return 0;
    } else {
      ll ans = 1;
      ll num = 0;
      for (int i = n - 1; i >= 0; i--) {
        if (num == k) {
          break;
        }
        if (b[i].second) {
          ans *= b[i].first;
          ans %= MOD;
        } else {
          ans *= (MOD - b[i].first);
          ans %= MOD;
        }
        num++;
      }
      cout << ans << endl;
    }
  } else if (pnum + mnum < k) {
    cout << 0 << endl;
    return 0;
  } else if (pnum + mnum == k) {
    if (mnum % 2 == 0) {
      ll ans = 1;
      ll num = 0;
      for (int i = 0; i < n; i++) {
        if (num == k) {
          break;
        }
        if (b[i].second) {
          ans *= b[i].first;
          ans %= MOD;
        } else {
          ans *= (MOD - b[i].first);
          ans %= MOD;
        }
        num++;
      }
      cout << ans << endl;
    } else {
      if (zero > 0) {
        cout << 0 << endl;
        return 0;
      } else {
        ll ans = 1;
        ll num = 0;
        for (int i = n - 1; i >= 0; i--) {
          if (num == k) {
            break;
          }
          if (!b[i].second) {
            ans *= (MOD - b[i].first);
            ans %= MOD;
          } else {
            ans *= b[i].first;
            ans %= MOD;
          }
          num++;
        }
        cout << ans << endl;
        return 0;
      }
    }
  } else {
    if (k % 2 == 0) {
      if (pnum % 2 != 0) {
        pnum--;
      }
      ll ans = 1;
      ll num = 0;
      ll mct = 0;
      ll pct = 0;
      while (true) {
        if (num == k) {
          break;
        }
        ll mtmp = -1;
        if (mct + 1 < m.size()) {
          mtmp = m[mct] * m[mct + 1];
        }
        ll ptmp = -1;
        if (pct + 1 < p.size()) {
          ptmp = p[pct] * p[pct + 1];
        }
        if (mtmp > ptmp) {
          mct += 2;
          ans *= (mtmp) % MOD;
          ans %= MOD;
        } else {
          pct += 2;
          ans *= (ptmp) % MOD;
          ans %= MOD;
        }
        num += 2;
      }
      cout << ans << endl;
      return 0;
    } else {
      ll num = 1;
      ll ans = p[0];
      ll mct = 0;
      ll pct = 1;
      while (true) {
        if (num == k) {
          break;
        }
        ll mtmp = -1;
        if (mct + 1 < m.size()) {
          mtmp = m[mct] * m[mct + 1];
        }
        ll ptmp = -1;
        if (pct + 1 < p.size()) {
          ptmp = p[pct] * p[pct + 1];
        }
        if (mtmp > ptmp) {
          mct += 2;
          ans *= mtmp % MOD;
          ans %= MOD;
        } else {
          pct += 2;
          ans *= ptmp % MOD;
          ans %= MOD;
        }
        num += 2;
      }
      cout << ans << endl;
      return 0;
    }
  }

  return 0;
}