Problem:
Score : 500 points

Problem Statement

Given are N integers A_1,\ldots,A_N.

We will choose exactly K of these elements. Find the maximum possible product of the chosen elements.

Then, print the maximum product modulo (10^9+7), using an integer between 0 and 10^9+6 (inclusive).

Constraints

1 \leq K \leq N \leq 2\times 10^5

|A_i| \leq 10^9

Input

Input is given from Standard Input in the following format:

N K
A_1 \ldots A_N

Output

Print the maximum product modulo (10^9+7), using an integer between 0 and 10^9+6 (inclusive).

Sample Input 1

4 2
1 2 -3 -4

Sample Output 1

12

The possible products of the two chosen elements are 2, -3, -4, -6, -8, and 12, so the maximum product is 12.

Sample Input 2

4 3
-1 -2 -3 -4

Sample Output 2

1000000001

The possible products of the three chosen elements are -24, -12, -8, and -6, so the maximum product is -6.

We print this value modulo (10^9+7), that is, 1000000001.

Sample Input 3

2 1
-1 1000000000

Sample Output 3

1000000000

The possible products of the one chosen element are -1 and 1000000000, so the maximum product is 1000000000.

Sample Input 4

10 10
1000000000 100000000 10000000 1000000 100000 10000 1000 100 10 1

Sample Output 4

999983200

Be sure to print the product modulo (10^9+7).

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(var, begin, end) for (int var = (begin); var <= (end); var++)
#define RFOR(var, begin, end) for (int var = (begin); var >= (end); var--)
#define REP(var, length) FOR(var, 0, length - 1)
#define RREP(var, length) RFOR(var, length - 1, 0)
#define EACH(value, var) for (auto value : var)
#define SORT(var) sort(var.begin(), var.end())
#define REVERSE(var) reverse(var.begin(), var.end())
#define RSORT(var) \
  SORT(var);       \
  REVERSE(var)
#define OPTIMIZE_STDIO         \
  ios::sync_with_stdio(false); \
  cin.tie(0);                  \
  cout.precision(10);          \
  cout << fixed
#define endl '\n'

const int INF = 1e9;
const int MOD = 1e9 + 7;
const ll LINF = 1e18;

void solve(istream& cin, ostream& cout) {
  int n, k;
  cin >> n >> k;
  vector<ll> a(n);
  int plus = 0, zero = 0, minus = 0;
  REP(i, n) {
    cin >> a[i];
    if (a[i] > 0) plus++;
    else if (a[i] == 0)
      zero++;
    else
      minus++;
  }
  SORT(a);
  if (k > (plus + minus) && zero != 0) {
    cout << 0 << endl;
    return;
  }
  ll ans = 1;
  if (plus == 0) {
    if (k & 1) REVERSE(a);
    REP(i, k) {
      ans *= a[i];
      ans %= MOD;
    }
    if (ans < 0) ans += MOD;
    cout << ans << endl;
    return;
  }
  int l = 0, r = n - 1;
  // 正負 flag
  bool pos = true;
  REP(i, k) {
    ll lx = a[l], rx = a[r];
    if (i == k - 1) {
      if (pos) ans *= rx;
      else
        ans *= lx;
      ans %= MOD;
      break;
    }
    if (abs(lx) > abs(rx)) {
      ans *= lx;
      if (lx < 0) pos = !pos;
      l++;
    } else {
      ans *= rx;
      if (rx < 0) pos = !pos;
      r--;
    }
    ans %= MOD;
  }
  if (ans < 0) ans += MOD;
  ans %= MOD;
  cout << ans << endl;
}

#ifndef TEST
int main() {
  OPTIMIZE_STDIO;
  solve(cin, cout);
  return 0;
}
#endif