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 <iostream>
#include <algorithm>
#include <iomanip>
#include <string>
#include <vector>
#include <math.h>
#include <queue>
#include <deque>
#include <stack>
#include <map>
const int MOD = 1e9+7;
#define PI 3.14159265359
typedef long long ll;
using namespace std;

ll llmin(ll x, ll y){
	if (x > y) return y;
	return x;
}

ll llmax(ll x, ll y){
	if (x > y) return x;
	return y;
}

ll modpow(ll a, ll n) {
    ll res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return res;
}

ll modinv(ll a) {
    return modpow(a, MOD - 2);
}

int main(){
	ll n, k;
	cin >> n >> k;
	vector<pair<ll, ll> > vec;
	if (n == k){
		ll ans = 1;
		for (int i = 0; i < n; i++){
			ll x;
			cin >> x;
			ans = ans * x % MOD;
		}
		cout << ans << endl;
		return 0;
	}
	ll tmp = 0;
	for (int i = 0; i < n; i++){
		ll x;
		cin >> x;
		if (x < 0) tmp++;
		if (x == 0) vec.push_back(make_pair(0, 0));
		else vec.push_back(make_pair(abs(x), x/abs(x)));
	}
	if (tmp == n && k%2){
		ll ans = 1;
		sort(vec.begin(), vec.end());
		for (int i = 0; i < k; i++){
			ans = ans * vec[i].first % MOD;
		}
		if (ans == 0) cout << 0 << endl;
		else cout << MOD - ans << endl;
		return 0;
	}
	sort(vec.begin(), vec.end(), greater<pair<ll, ll> >());
	ll ans = 1, coun = 0;
	for (int i = 0; i < k; i++){
		ans = ans * vec[i].first % MOD;
		if (vec[i].second == -1) coun++;
	}
	if (vec[k-1].first == 0){
		cout << 0 << endl;
		return 0;
	}
	if (coun % 2){
		ll minplus = MOD, minminus = MOD;
		ll maxplus = 0, maxminus = 0;
		for (int i = 0; i < k; i++){
			if (vec[i].second == 1){
				minplus = llmin(minplus, vec[i].first);
			}else if (vec[i].second == -1){
				minminus = llmin(minminus, vec[i].first);
			}
		}
		for (int i = k; i < n; i++){
			if (vec[i].second == 1){
				maxplus = llmax(maxplus, vec[i].first);
			}else if (vec[i].second == -1){
				maxminus = llmax(maxminus, vec[i].first);
			}
		}
		if (maxplus != 0 && maxminus != 0){
			if (maxminus/minplus > maxplus/minminus){
				//cout << (ans*modinv(minplus)%MOD)*maxminus%MOD << endl;
			}else{
				//cout << (ans*modinv(minminus)%MOD)*maxplus%MOD << endl;
			}
		}else if (maxplus != 0){
				cout << (ans*modinv(minminus)%MOD)*maxplus%MOD << endl;
		}else{
				cout << (ans*modinv(minplus)%MOD)*maxminus%MOD << endl;
		}
	}else{
		cout << ans << endl;
	}
	return 0;
}