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: Runtime Error)

#include <bits/stdc++.h>
#define rep(i,n) for(int i=(0);i<(n);i++)

using namespace std;

typedef long long ll;

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

bool canpos(ll s, ll t, ll k){
	if(s == 0) return k % 2 == 0;
	if(s + t == k) return t % 2 == 0;
	return true;
}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);

	ll MOD = 1e9 + 7;

	ll n, k;
	cin >> n >> k;

	vector<ll> a(n);
	rep(i, n) cin >> a[i];

	deque<ll> pos, zer, neg;
	rep(i, n){
		if(a[i] > 0) pos.push_back(a[i]);
		if(a[i] == 0) zer.push_back(a[i]);
		if(a[i] < 0) neg.push_back(-a[i]);
	}
	sort(pos.begin(), pos.end(), greater<ll>());
	sort(neg.begin(), neg.end(), greater<ll>());

	int s = pos.size();
	int z = zer.size();
	int t = neg.size();

	ll ans;
	if(canpos(s, t, k)){
		ll ans = 1ll;
		
		if(k % 2 == 1 && pos.size() >= 1){
			ans *= pos.front();
			pos.pop_front();
			s--;
			k--;
		}

		vector<ll> v;
		for(int i = 0; i < s; i += 2){
			ll l = pos[i];
			if(i+1 < s) l *= pos[i+1];
			v.push_back(l);
		}

		for(int i = 0; i < t; i += 2){
			ll l = neg[i];
			if(i+1 < s) l *= neg[i+1];
			v.push_back(l);
		}

		sort(v.begin(), v.end(), greater<ll>());

		rep(i, k / 2){
			ans *= v[i] % MOD;
			ans %= MOD;
		}

		cout << ans << endl;
	}else if(z > 0){
		cout << 0 << endl;
	}else{
		vector<ll> v;
		rep(i, s) v.push_back(pos[i]);
		rep(i, t) v.push_back(neg[i]);

		sort(v.begin(), v.end());

		ans = 1ll;
		rep(i, k){
			ans *= v[i];
			ans %= MOD;
		}
		ans = MOD - ans;
		ans %= MOD;

		cout << ans << endl;
	}
}