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

/*
Written By mafailure
*/
// In the name of God
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less
using namespace std;
using namespace __gnu_pbds;
#define IOS                                                                    \\
  ios::sync_with_stdio(0);                                                     \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define endl "\\n"
#define int long long
// #define int long long
//  int dx[]={-1,1,0,0}; int dy[]={0,0,1,-1};
//  int dx[]={2,2,-2,-2,1,1,-1,-1}; int dy[]={1,-1,1,-1,2,-2,2,-2};
const long long mod = 1e9 + 7;
const double eps = 1e-9;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef pair<int, int> ii;
typedef vector<pair<int, int>> vii;
typedef map<int, int> mii;
typedef pair<int, ii> pip;
typedef pair<ii, int> ppi;
#define arrinp(arr, init, final, size, type)                                   \\
  type *arr = new type[size];                                                  \\
  for (int i = init; i < final; i++)                                           \\
    cin >> arr[i];
#define cr2d(arr, n, m, t)                                                     \\
  t **arr = new t *[n];                                                        \\
  for (int i = 0; i < n; i++)                                                  \\
    arr[i] = new t[m];
#define w(t)                                                                   \\
  int t;                                                                       \\
  cin >> t;                                                                    \\
  while (t--)
#define takeInp(n)                                                             \\
  int n;                                                                       \\
  cin >> n;
#define fr(i, init, final) for (int i = init; i < final; i++)
#define frr(i, init, final) for (int i = init; i >= final; i--)
#define Fr(i, final) for (int i = 0; i < final; i++)
#define Frr(i, first) for (int i = first; i >= 0; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define debug(x) cerr << ">value (" << #x << ") : " << x << endl;
#define setb __builtin_popcount
#define lsone(n) (n & (-n))
#define rlsone(n) (n & (n - 1))
#define clr(a, b) memset(a, b, sizeof(a))
const int inf = INT_MAX;
// struct point_i{int x,y;};
struct point_i {
  int x, y;
  point_i() {
    x = 0;
    y = 0;
  }
  point_i(int x_, int y_) {
    x = (x_);
    y = (y_);
  }
};

struct point {
  float x, y;
  point() { x = y = 0.0; }
  point(float x_, float y_) {
    x = (x_);
    y = (y_);
  }
  bool operator<(point other) const {
    if (fabs(x - other.x) > eps)
      return x < other.x;
    return y < other.y;
  }
  bool operator==(point other) const {
    return fabs(other.x - x) <= eps && fabs(other.y - y) <= eps;
  }
};
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
vi init(string s) {
  istringstream sin(s);
  int n;
  vi arr;
  while (sin >> n)
    arr.push_back(n);
  return arr;
}
int power(int x, int y) {
  if (y == 0)
    return 1;
  int u = power(x, y / 2);
  u = (u * u) % mod;
  if (y % 2)
    u = (x * u) % mod;
  return u;
}
int gcd(int a, int b) {
  if (a < b)
    return gcd(b, a);
  return (b == 0 ? a : (a % b ? gcd(b, a % b) : b));
}
int gcd_e(int a, int b, int &x, int &y) {

  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  int x1, y1;
  int p = gcd_e(b, a % b, x1, y1);
  x = y1;
  y = x1 - (a / b) * y1;
  return p;
}
int domod(int k) {
  if (k < 0)
    k += ((abs(k) + mod) / mod) * mod;
  else
    k -= (k / mod) * mod;
  return k;
}
signed main() {
  IOS int n, k;
  cin >> n >> k;
  vi a(n);
  vi pos, neg;
  fr(i, 0, n) {
    cin >> a[i];
    if (a[i] < 0)
      neg.pb(a[i]);
    else
      pos.pb(a[i]);
  }
  sort(all(neg));
  sort(all(pos), greater<int>());
  sort(all(a), greater<int>());
  int negmul[neg.size() + 1];
  negmul[0] = 1;
  fr(i, 1, neg.size() + 1) negmul[i] = domod(negmul[i - 1] * neg[i - 1]);
  int posmul[pos.size() + 1];
  posmul[0] = 1;
  fr(i, 1, pos.size() + 1) posmul[i] = domod(posmul[i - 1] * pos[i - 1]);
  int ans = 1;
  if (pos.size() + (neg.size() - neg.size() % 2) >= k &&
      (k % 2 == 0 || pos.size())) {
    if (k % 2)
      ans = pos[0];
    vi v;
    if (pos.size() >= 2 + (k % 2))
      fr(i, k % 2, pos.size() - 1) v.pb(pos[i] * pos[i + 1]), i++;
    if (neg.size() > 1)
      fr(i, 0, neg.size() - 1) v.pb(neg[i] * neg[i + 1]), i++;
    sort(all(v), greater<int>());
    fr(i, 0, k / 2) ans = (domod(ans * domod(v[i])));

  }

  else {
    ans = 1;
    fr(i, 0, k) { ans = domod(ans * a[i]); }
  }
  cout << ans << endl;
}


Error: 0

Fixed submission:

/*
Written By mafailure
*/
// In the name of God
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less
using namespace std;
using namespace __gnu_pbds;
#define IOS                                                                    \\
  ios::sync_with_stdio(0);                                                     \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define endl "\\n"
#define int long long
// #define int long long
//  int dx[]={-1,1,0,0}; int dy[]={0,0,1,-1};
//  int dx[]={2,2,-2,-2,1,1,-1,-1}; int dy[]={1,-1,1,-1,2,-2,2,-2};
const long long mod = 1e9 + 7;
const double eps = 1e-9;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef pair<int, int> ii;
typedef vector<pair<int, int>> vii;
typedef map<int, int> mii;
typedef pair<int, ii> pip;
typedef pair<ii, int> ppi;
#define arrinp(arr, init, final, size, type)                                   \\
  type *arr = new type[size];                                                  \\
  for (int i = init; i < final; i++)                                           \\
    cin >> arr[i];
#define cr2d(arr, n, m, t)                                                     \\
  t **arr = new t *[n];                                                        \\
  for (int i = 0; i < n; i++)                                                  \\
    arr[i] = new t[m];
#define w(t)                                                                   \\
  int t;                                                                       \\
  cin >> t;                                                                    \\
  while (t--)
#define takeInp(n)                                                             \\
  int n;                                                                       \\
  cin >> n;
#define fr(i, init, final) for (int i = init; i < final; i++)
#define frr(i, init, final) for (int i = init; i >= final; i--)
#define Fr(i, final) for (int i = 0; i < final; i++)
#define Frr(i, first) for (int i = first; i >= 0; i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(c) (c).begin(), (c).end()
#define rall(c) (c).rbegin(), (c).rend()
#define debug(x) cerr << ">value (" << #x << ") : " << x << endl;
#define setb __builtin_popcount
#define lsone(n) (n & (-n))
#define rlsone(n) (n & (n - 1))
#define clr(a, b) memset(a, b, sizeof(a))
const int inf = INT_MAX;
// struct point_i{int x,y;};
struct point_i {
  int x, y;
  point_i() {
    x = 0;
    y = 0;
  }
  point_i(int x_, int y_) {
    x = (x_);
    y = (y_);
  }
};

struct point {
  float x, y;
  point() { x = y = 0.0; }
  point(float x_, float y_) {
    x = (x_);
    y = (y_);
  }
  bool operator<(point other) const {
    if (fabs(x - other.x) > eps)
      return x < other.x;
    return y < other.y;
  }
  bool operator==(point other) const {
    return fabs(other.x - x) <= eps && fabs(other.y - y) <= eps;
  }
};
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
vi init(string s) {
  istringstream sin(s);
  int n;
  vi arr;
  while (sin >> n)
    arr.push_back(n);
  return arr;
}
int power(int x, int y) {
  if (y == 0)
    return 1;
  int u = power(x, y / 2);
  u = (u * u) % mod;
  if (y % 2)
    u = (x * u) % mod;
  return u;
}
int gcd(int a, int b) {
  if (a < b)
    return gcd(b, a);
  return (b == 0 ? a : (a % b ? gcd(b, a % b) : b));
}
int gcd_e(int a, int b, int &x, int &y) {

  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  int x1, y1;
  int p = gcd_e(b, a % b, x1, y1);
  x = y1;
  y = x1 - (a / b) * y1;
  return p;
}
int domod(int k) {
  if (k < 0)
    k += ((abs(k) + mod) / mod) * mod;
  else
    k -= (k / mod) * mod;
  return k;
}
signed main() {
  IOS int n, k;
  cin >> n >> k;
  vi a(n);
  vi pos, neg;
  fr(i, 0, n) {
    cin >> a[i];
    if (a[i] < 0)
      neg.pb(a[i]);
    else
      pos.pb(a[i]);
  }
  sort(all(neg));
  sort(all(pos), greater<int>());
  sort(all(a), greater<int>());
  int negmul[neg.size() + 1];
  negmul[0] = 1;
  fr(i, 1, neg.size() + 1) negmul[i] = domod(negmul[i - 1] * neg[i - 1]);
  int posmul[pos.size() + 1];
  posmul[0] = 1;
  fr(i, 1, pos.size() + 1) posmul[i] = domod(posmul[i - 1] * pos[i - 1]);
  int ans = 1;
  if (pos.size() + (neg.size() - neg.size() % 2) >= k &&
      (k % 2 == 0 || pos.size())) {
    if (k % 2)
      ans = pos[0];
    vi v;
    fr(i, k % 2, pos.size() - 1) v.pb(pos[i] * pos[i + 1]);
    fr(i, 0, neg.size() - 1) v.pb(neg[i] * neg[i + 1]);
    sort(all(v), greater<int>());
    fr(i, 0, k / 2) ans = (domod(ans * v[i]));

  }

  else {
    ans = 1;
    fr(i, 0, k) { ans = domod(ans * a[i]); }
  }
  cout << ans << endl;
}