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)

//Hope is a good thing, May be the best of things.. And no good thing ever dies 
// Giving up was never an option <3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define pii pair <int, int>
#define pll pair <long long, long long >
#define PI (2.0 * acos(0.0))
#define testcase ll T; cin >> T; for (ll tc = 1; tc <= T; tc++)
const long long M = 2e5 + 10, M2 = 2e6 + 10, oo = 1e9 + 7;
void solve () {
	ll n, k;
	cin >> n >> k;
	vector < ll > neg, pos, v;
	vector < pll> vp;
	for (int i = 0, x = 0; i < n; i++) {
		cin >> x;
		v.pb(abs(x));
		if (x >= 0) {
			pos.pb(x);
			vp.pb({abs(x), 1});
		}
		else {
			neg.pb(abs(x));
			vp.pb({abs(x), 0});	
		}	
	}
	ll ok = 0;
	if ((ll)pos.size() + neg.size() - (neg.size() % 2) > k) {
		ok = 1;
	}	
	ll mul = 1;	
	if (!ok) {
		cout << "No " << endl;
		sort(v.begin(), v.end());
		for (ll i = 0; i < k; i++) {
			mul = (mul * v[i]) % oo;
		}
		mul = (oo - mul) % oo;
		cout << mul << endl;
	}
	else {
		ll a1 = 0, a2 = 0, b1 = 0, b2 = 0;
		sort(vp.begin(), vp.end());
		sort(pos.begin(), pos.end()); sort(neg.begin(), neg.end());
		vector < ll > nv;
		ll cnt = 0;
		ll lsti = -1;
		for (int i = n - 1; i >= n - k; i--) {
			//cout << vp[i].first << endl;
			cnt += vp[i].second;
			nv.pb(vp[i].first);
			if (vp[i].second) {
				pos.pop_back();
				a1 = nv.size() - 1;
			}
			else {
				neg.pop_back();
				a2 = nv.size() - 1;
			}
		}

		if (cnt % 2 != k % 2) {
			if (neg.size()) {
				b1 = neg.back();
			}
			else b1 = -1;
			if (pos.size()) {
				b2 = pos.back();
			}
			else b2 = -1;
			if (nv[a2] * b1 > nv[a1] * b2) nv[a1] = b1;
			else nv[a2] = b1;
		}

		for (ll i = 0; i < nv.size(); i++) {
			mul = (mul * nv[i]) % oo;
		}
		cout << mul << endl;
	}
}
int main () {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    //testcase {
        solve ();
		
    //}
    return 0;
}