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: Accepted)

#include <bits/stdc++.h>
#define newl "\n"
using namespace std;
using lli = long long int;
using vvint = vector <vector <int>>;
const int mod = 1e9 + 7;

const int N = 2e5 + 1;
bool comp(pair <int,bool> &p1,pair <int,bool>&p2){
	return abs(p1.first) > abs(p2.first);
}

void solve(){
	int n,k;
	cin >> n >> k;
	vector <pair <int,bool>> a(n);
	for(int i = 0;i < n;++i){
		int num;
		cin >> num;
		if(num < 0) a[i] = {num,1};
		else a[i] = {num,0};
	}
	sort(a.begin(),a.end(),comp);
	bool par = 0;
	for(int i = 0;i < k;++i) par ^= a[i].second;
	if(!par or k == n){
		lli ans = 1;
		for(int i = 0;i < k;++i) ans = (ans * a[i].first) % mod;
		cout << (ans + mod) % mod << newl;
	}
	else{
		int sn = mod,sp = -mod;
		for(int i = 0;i < k;++i){
			if(a[i].second) sn = i;
		}
		for(int i = 0;i < k;++i){
			if(!a[i].second) sp = i;
		}
		if(sp == -mod){
			//cout << "yes" << newl;
			int sp1 = -mod;
			for(int i = k;i < n;++i){
				if(!a[i].second){
					sp1 = i;
					break;
				}
			}
			if(sp1 == -mod){
				lli ans = 1;
				for(int i = n - 1;i >= n - k;--i) ans = (ans * a[i].first) % mod;
				cout << (ans + mod) % mod << newl;
			}
			else{
				lli ans = 1;
				for(int i = 0;i < k - 1;++i) ans = (ans * a[i].first) % mod;
				ans = (ans * a[sp1].first) % mod;
				cout << (ans + mod) % mod << newl;
			}
		}
		else{
			int sn1 = mod, sp1 = -mod;
			for(int i = k;i < n;++i){
				if(a[i].second){
					sn1 = i;
					break;
				}
			}
			for(int i = k;i < n;++i){
				if(!a[i].second){
					sp1 = i;
					break;
				}
			}
			if(sp1 == -mod){
				lli ans = 1;
				for(int i = 0;i < k;++i) if(i != sp) ans = (ans * a[i].first) % mod;
				ans = (ans * a[k].first) % mod;
				cout << (ans + mod) % mod << newl;
				return;
			}
			if(sn1 == mod){
				lli ans = 1;
				for(int i = 0;i < k;++i) if(i != sn) ans = (ans * a[i].first) % mod;
				ans = (ans * a[k].first) % mod;
				cout << (ans + mod) % mod << newl;
				return;
				
			}
			if((lli)a[sp].first * a[sp1].first > (lli)a[sn1].first * a[sn].first){
				lli ans = 1;
				for(int i = 0;i < k;++i) if(i != sn) ans = (ans * a[i].first) % mod;
				ans = (ans * a[sp1].first) % mod;
				cout << (ans + mod) % mod << newl;
			}
			else{
				lli ans = 1;
				for(int i = 0;i < k;++i) if(i != sp) ans = (ans * a[i].first) % mod;
				ans = (ans * a[sn1].first) % mod;
				cout << (ans + mod) % mod << newl;
			}
		}
	}
	return;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout << fixed << setprecision(10);
	#ifdef EXECUTE_LOCALLY
		   freopen("in.txt","r",stdin);
	#endif
	int t = 1;
	//cin >> t;
	while(t--) solve();
	#ifdef EXECUTE_LOCALLY
    	cout << setprecision(3) << "program time: " << (double)clock() / CLOCKS_PER_SEC << newl;
	#endif
	return 0;
}