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;
#define ff first
#define ss second
#define pb push_back
#define debug(val) cerr << "The value of " << #val << " is = " << val << '\n';
typedef long long ll;
typedef long double ld;
const ld pi = 4*atan((ld)1);
const ll mod = 1e9 + 7;
const ll inf = 922337203685477;
const ll nax = 2e5 + 5;

ll n, k, x, idxa, idxb;
vector<ll> a, b, c;
priority_queue<ll> v, u;

ll val(ll x){
	if(x == 1){
		if(v.empty()){
			return -inf;
		}
		else{
			return v.top();
		}
	}
	else if(x == 2){
		if(u.empty()){
			return -inf;
		}
		else{
			return u.top();
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	
	cin >> n >> k;
	for(ll i = 0; i < n; i++){
		cin >> x;
		if(x > 0){
			a.pb(x);
		}
		else if(x < 0){
			b.pb(x);
		}
		else{
			c.pb(x);
		}
	}
	sort(a.rbegin(), a.rend());
	sort(b.begin(), b.end());
	for(ll i = 1; i < a.size(); i += 2){
		v.push(a[i] * a[i-1]);
	}
	for(ll i = 1; i < b.size(); i += 2){
		u.push(b[i] * b[i-1]);
	}
	
	ll ans = 1, cnt = k;
	if(a.size() == 0){
		if(k % 2 == 0 && b.size() % 2 == 0){
			while(cnt > 1){
				ll ret2 = val(2);
				if(ret2 == -inf){
					break;
				}
				ans *= ret2;
				cnt -= 2;
				u.pop();
			}
		}
		else if(c.size() > 0){
			cout << 0 << '\n';
			return 0;
		}
		else{
			for(ll i = b.size() - 1; i >= 0; i--){
				if(cnt == 0){
					break;
				}
				ans *= b[i];
				ans = (ans + mod) % mod;
				cnt--;
			}
		}
		if(cnt > 0){
			if(c.size() > 0){
				ans = 0;
			}
		}
		cout << ans << '\n';
		return 0;
	}
	while(cnt > 1){
		ll ret1 = val(1), ret2 = val(2);
		if(ret1 == -inf && ret2 == -inf){
			break;
		}
		else{
			if(ret1 >= ret2){
				ans *= ret1 % mod;
				ans = (ans + mod) % mod;
				v.pop();
				idxa += 2;
			}
			else{
				ans *= ret2 % mod;
				ans = (ans + mod) % mod;
				u.pop();
				idxb += 2;
			}
			cnt -= 2;
		}
	}
	if(cnt > 0){
		for(ll i = idxa; i < a.size(); i++){
			if(cnt == 0){
				break;
			}
			ans *= a[i];
			ans = (ans + mod) % mod;
			cnt--;
		}
	}
	else if(cnt > 0){
		if(c.size() > 0){
			ans = 0;
		}
		else{
			for(ll i = idxb; i < b.size(); i++){
				if(cnt == 0){
					break;
				}
				ans *= b[i];
				ans = (ans + mod) % mod;
				cnt--;
			}
		}
	}
	cout << ans << '\n';
}