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

// Leonidas
#pragma GCC optimize("Ofast")
// #pragma GCC target ("avx2")
// #pragma GCC optimization ("O3")
#pragma GCC optimization("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container'.',hpp>
// #include <ext/pb_ds/tree_policy'.',hpp>
// typedef tree < int , null_type, less <int>, rb_tree_tag,
// tree_order_statistics_node_update> TREE;
#define ll long long
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define pii pair<int, int>
#define pss pair<short, short>
#define pld pair<long double, long double>
#define ld long double
#define piii pair<pii, int>
#define vii vector<pair<int, int>>
#define st first
#define nd second
#define pll pair<ll, ll>
#define speed                                                                  \\
  ios::sync_with_stdio(0);                                                     \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define M_PI 3.14159265358979323846
#define int long long
const int mod = 1e9 + 7;
// const int mod=1009;
// const int mod=998244353;
const int inf = 1000000009;
const long long INF = 1000000000000000009;
const long long big = 1000000000000000;
const long double eps = 0.000000000000000000001;
using namespace std;
vi D, U;
int32_t main() {
  speed int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    if (a < 0)
      U.pb(-a);
    else
      D.pb(a);
  }
  sort(D.begin(), D.end());
  sort(U.begin(), U.end());
  n = D.size();
  int m = U.size();
  ll wynik = 1;
  if (n == 0 && (k & 1)) {
    for (int i = 0; i < k; i++) {
      wynik *= U[i];
      wynik %= mod;
    }
    wynik = (mod - wynik) % mod;
    cout << wynik;
    return 0;
  } else if (n + m == k) {
    for (int i = 0; i < m; i++) {
      wynik *= U[i];
      wynik %= mod;
    }
    for (int i = 0; i < n; i++) {
      wynik *= D[i];
      wynik %= mod;
    }
    if (m & 1)
      wynik = (mod - wynik) % mod;
    cout << wynik;
    return 0;
  }
  n = n - 1, m = m - 1;
  while (k > 0) {
    if (n >= 2 && (m <= 0 || D[n] * D[n - 1] > U[m] * U[m - 1]) && k % 2 == 0 &&
        k >= 2) {
      //   cout<<"jeden"<<endl;
      wynik *= D[n];
      wynik %= mod;
      wynik *= D[n - 1];
      wynik %= mod;
      n -= 2;
      k -= 2;
    } else if (n >= 2 && (m <= 0 || D[n - 1] * D[n - 2] > U[m] * U[m - 1]) &&
               k >= 2) {
      // cout<<"dwa"<<endl;
      wynik *= D[n];
      wynik %= mod;
      wynik *= D[n - 1];
      wynik %= mod;
      n -= 2;
      k -= 2;
    } else if (m >= 1 &&
               (n <= 0 || U[m] * U[m - 1] >= D[n] * D[n - 1] ||
                (n == 2 && D[n - 1] * D[n - 2] <= U[m] * U[m - 1])) &&
               k >= 2) {
      // cout<<"trzy"<<endl;
      wynik *= U[m];
      wynik %= mod;
      wynik *= U[m - 1];
      wynik %= mod;
      m -= 2;
      k -= 2;
    } else if (n == 1 && k % 2 == 0 && k >= 2) {
      // cout<<"cztery"<<endl;
      wynik *= D[n];
      wynik %= mod;
      wynik *= D[n - 1];
      wynik %= mod;
      n -= 2;
      k -= 2;
    } else if (k == 1) {
      // cout<<"piec"<<endl;
      wynik *= D[n];
      wynik %= mod;
      n--;
      k--;
    }
  }
  cout << wynik;
  return 0;
}


Error: WA

Fixed submission:

// Leonidas
#pragma GCC optimize("Ofast")
// #pragma GCC target ("avx2")
// #pragma GCC optimization ("O3")
#pragma GCC optimization("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container'.',hpp>
// #include <ext/pb_ds/tree_policy'.',hpp>
// typedef tree < int , null_type, less <int>, rb_tree_tag,
// tree_order_statistics_node_update> TREE;
#define ll long long
#define ull unsigned long long int
#define pb push_back
#define mp make_pair
#define vi vector<int>
#define pii pair<int, int>
#define pss pair<short, short>
#define pld pair<long double, long double>
#define ld long double
#define piii pair<pii, int>
#define vii vector<pair<int, int>>
#define st first
#define nd second
#define pll pair<ll, ll>
#define speed                                                                  \\
  ios::sync_with_stdio(0);                                                     \\
  cin.tie(0);                                                                  \\
  cout.tie(0);
#define M_PI 3.14159265358979323846
#define int long long
const int mod = 1e9 + 7;
// const int mod=1009;
// const int mod=998244353;
const int inf = 1000000009;
const long long INF = 1000000000000000009;
const long long big = 1000000000000000;
const long double eps = 0.000000000000000000001;
using namespace std;
vi D, U;
int32_t main() {
  speed int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    int a;
    cin >> a;
    if (a < 0)
      U.pb(-a);
    else
      D.pb(a);
  }
  sort(D.begin(), D.end());
  sort(U.begin(), U.end());
  n = D.size();
  int m = U.size();
  ll wynik = 1;
  if (n == 0) {
    if (k & 1) {
      for (int i = 0; i < k; i++) {
        wynik *= (-U[i]);
        wynik += mod * mod;
        wynik %= mod;
      }

    } else {
      for (int i = n - 1; i >= n - k; i--) {
        wynik *= (-U[i]);
        wynik += mod * mod;
        wynik %= mod;
      }
    }
    cout << wynik;
    return 0;
  }
  n = n - 1, m = m - 1;
  while (k > 0) {
    if (n >= 2 && (m <= 1 || D[n] * D[n - 1] > U[m] * U[m - 1])) {
      wynik *= D[n];
      wynik %= mod;
      wynik *= D[n - 1];
      wynik %= mod;
      n -= 2;
      k -= 2;
    } else if (m >= 1 && (n <= 1 || U[m] * U[m - 1] >= D[n] * D[n - 1])) {
      wynik *= U[m];
      wynik %= mod;
      wynik *= U[m - 1];
      wynik %= mod;
      m -= 2;
      k -= 2;
    } else if (n == 1 && k % 2 == 0) {
      wynik *= D[n];
      wynik %= mod;
      wynik *= D[n - 1];
      wynik %= mod;
      n -= 2;
      k -= 2;
    } else if (n == 0 && k % 2 == 1) {
      wynik *= D[n];
      wynik %= mod;
      n--;
      k--;
    }
  }
  cout << wynik;
  return 0;
}