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

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

vector<ll> a, b;
ll K;

ll zer = 0;
void fu() {
  if (zer > 0) {
    cout << 0 << endl;
    exit(0);
  }
  vector<ll> v;
  for (auto x : a)
    v.pb(x);
  for (auto x : b)
    v.pb(x);
  SORT(v);

  ll ans = mod(-1);
  rep(i, 0, K - 1) { ans = mod(ans * v[i]); }
  cout << mod(ans) << endl;
  exit(0);
}

ll cal1() {

  ll n, k;
  cin >> n >> k;
  K = k;
  rep(i, 0, n - 1) {
    ll t;
    cin >> t;
    if (t == 0)
      zer++;
    else if (t > 0)
      a.pb(t);
    else
      b.pb(-t);
  }

  ll as = a.size(), bs = b.size();
  if (as + bs < k) {
    cout << 0 << endl;
    return 0;
  }
  if (as + bs / 2 * 2 < k) {
    fu();
  }

  SORT(a);
  SORT(b);
  ll apos = as - 1, bpos = bs - 1;
  ll ans = 1;
  if (k % 2 == 1) {
    if (apos == -1) {
      fu();
    }
    ans = a[apos];
    apos--;
    k--;
  }

  while (k > 0) {

    if (k >= 2) {
      ll sa = -1, sb = -1;
      if (apos >= 1) {
        sa = a[apos] * a[apos - 1];
      }
      if (bpos >= 1) {
        sb = b[bpos] * b[bpos - 1];
      }
      /*if(sa==-1&&sb==-1){
          if(apos==-1||bpos==-1){
              ans/=0;
              cout<<4/0<<endl;
              return 0;
          }
          fu();

      }*/
      if (sa < sb) {
        rep(z, 1, 2) {
          ans = mod(ans * b[bpos]);
          bpos--;
        }
      } else {
        rep(z, 1, 2) {
          ans = mod(ans * a[apos]);
          apos--;
        }
      }
      k -= 2;
    } else {
      break;
    }
  }

  cout << mod(ans) << endl;
  return 0;
}
/*
void cal2(ll n,ll k,ll a[]){
    ll ans=-inf;
    rep(i,0,(1ll<<n)-1){
        vector<ll>v;
        rep(j,0,n-1){
            if((i>>j)&1)v.pb(a[j]);
        }
        if(v.size()!=k)continue;
        ll mul=1;
        for(auto x:v)mul*=x;
        chmax(ans,mul);
    }
    cout<<mod(ans)<<endl;
}
*/
int main() {
  fastio cal1();

  return 0;
}

/*
 5 3
 4 3 -2 -2 -2
 */


Error: 0

Fixed submission:

// #include <bits/stdc++.h>
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

#include "boost/multiprecision/cpp_dec_float.hpp"
#include "boost/multiprecision/cpp_int.hpp"
namespace mp = boost::multiprecision;
typedef mp::cpp_int LL;
typedef mp::number<mp::cpp_dec_float<1024>>
    DD; // 仮数部が1024ビットの浮動小数点数型(TLEしたら小さくする)

typedef long double dd;
#define i_7 (ll)(1E9 + 7)
// #define i_7 998244353
#define i_5 i_7 - 2
ll mod(ll a) {
  ll c = a % i_7;
  if (c >= 0)
    return c;
  return c + i_7;
}
typedef pair<ll, ll> l_l;
typedef pair<dd, dd> d_d;
ll inf = (ll)1E16;
#define rep(i, l, r) for (ll i = l; i <= r; i++)
#define rrep(i, r, l) for (ll i = r; i >= l; i--)
#define pb push_back
ll max(ll a, ll b) {
  if (a < b)
    return b;
  else
    return a;
}
ll min(ll a, ll b) {
  if (a > b)
    return b;
  else
    return a;
}
void Max(ll &pos, ll val) { pos = max(pos, val); } // Max(dp[n],dp[n-1]);
void Min(ll &pos, ll val) { pos = min(pos, val); }
void Add(ll &pos, ll val) { pos = mod(pos + val); }
dd EPS = 1E-9;
#define fastio                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define fi first
#define se second
#define endl                                                                   \\
  "\\n" // インタラクティブで消す！！！！！！！！！！！！！！！！！！！！！
#define SORT(v) sort(v.begin(), v.end())
#define ERASE(v) v.erase(unique(v.begin(), v.end()), v.end())
#define POSL(v, x) (lower_bound(v.begin(), v.end(), x) - v.begin())
#define POSU(v, x) (upper_bound(v.begin(), v.end(), x) - v.begin())
template <class T, class S> inline bool chmax(T &a, S b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T, class S> inline bool chmin(T &a, S b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

void mod_print(ll k) {
  ll P = 1000;
  rep(y, 1, P) {
    ll x = mod(y * k);
    if (x + P >= i_7) {
      x -= i_7;
    }
    if (abs(x) <= P) {
      // cout<<x<<"/"<<y;
      cout << setprecision(5) << (dd)x / (dd)y;
      return;
    }
  }
  cout << "nun" << endl;
}
#define all(c) c.begin(), c.end()
//////////////////////////

vector<ll> a, b;
ll K;

ll zer = 0;
void fu() {
  if (zer > 0) {
    cout << 0 << endl;
    exit(0);
  }
  vector<ll> v;
  for (auto x : a)
    v.pb(x);
  for (auto x : b)
    v.pb(x);
  SORT(v);

  ll ans = mod(-1);
  rep(i, 0, K - 1) { ans = mod(ans * v[i]); }
  cout << mod(ans) << endl;
  exit(0);
}

ll cal1() {

  ll n, k;
  cin >> n >> k;
  K = k;
  rep(i, 0, n - 1) {
    ll t;
    cin >> t;
    if (t == 0)
      zer++;
    else if (t > 0)
      a.pb(t);
    else
      b.pb(-t);
  }

  ll as = a.size(), bs = b.size();
  if (as + bs < k) {
    cout << 0 << endl;
    return 0;
  }
  if (as + bs / 2 * 2 < k) {
    fu();
  }

  SORT(a);
  SORT(b);
  ll apos = as - 1, bpos = bs - 1;
  ll ans = 1;
  if (k % 2 == 1) {
    if (apos == -1) {
      cout << 4 / 0 << endl;
      return 0;
    }
    ans = a[apos];
    apos--;
    k--;
  }

  while (k > 0) {

    if (k >= 2) {
      ll sa = -1, sb = -1;
      if (apos >= 1) {
        sa = a[apos] * a[apos - 1];
      }
      if (bpos >= 1) {
        sb = b[bpos] * b[bpos - 1];
      }
      /*if(sa==-1&&sb==-1){
          if(apos==-1||bpos==-1){
              ans/=0;
              cout<<4/0<<endl;
              return 0;
          }
          fu();

      }*/
      if (sa < sb) {
        rep(z, 1, 2) {
          ans = mod(ans * b[bpos]);
          bpos--;
        }
      } else {
        rep(z, 1, 2) {
          ans = mod(ans * a[apos]);
          apos--;
        }
      }
      k -= 2;
    } else {
      break;
    }
  }

  cout << mod(ans) << endl;
  return 0;
}
/*
void cal2(ll n,ll k,ll a[]){
    ll ans=-inf;
    rep(i,0,(1ll<<n)-1){
        vector<ll>v;
        rep(j,0,n-1){
            if((i>>j)&1)v.pb(a[j]);
        }
        if(v.size()!=k)continue;
        ll mul=1;
        for(auto x:v)mul*=x;
        chmax(ans,mul);
    }
    cout<<mod(ans)<<endl;
}
*/
int main() {
  fastio cal1();

  return 0;
}

/*
 5 3
 4 3 -2 -2 -2
 */