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>
using namespace std;

typedef long long ll;
typedef pair<ll,ll> pi;
typedef vector<ll> vll;

ll N,K,tmp; const ll MOD=1000000007;
vector<ll> neg,pos,zero,negtmp,postmp;

ll negativewkwkwk(){
	if(zero.size()>0){
		return 0;
	}
	ll solve=1;
	for(int i=0; i<K; i++){
		if(pos.empty()||-neg.back()<pos.front()){
			solve=solve*neg.back()%MOD;
			neg.pop_back();
		}else{
			solve=solve*pos.front()%MOD;
			pos.erase(pos.begin());
		}
	}
	return solve;
}


ll sixpackabs(ll a){
	if(a<0){
		a=a+MOD;
	}
	return a%MOD;
}
int main(){
	cin>>N>>K;
	for(int i=0; i<N; i++){
		cin>>tmp;
		if(tmp<0){
			neg.push_back(tmp);
			negtmp.push_back(tmp);
		}
		if(tmp>0){
			pos.push_back(tmp);
			postmp.push_back(tmp);
		}
		if(tmp==0)zero.push_back(0);
	}
	sort(neg.begin(),neg.end());
	sort(pos.begin(),pos.end());
	ll solve=1;
	if(K%2==0){
		while(K>0){
			ll negatif,positif;
			if(neg.size()>=2){
				negatif=neg[0]*neg[1];
			}else{
				negatif=-1;
			}
			if(pos.size()>=2){
				positif=pos[pos.size()-1]*pos[pos.size()-2];
			}else{
				positif=-1;
			}
			if(negatif>=positif){
				neg.erase(neg.begin()); neg.erase(neg.begin());
				solve=solve*negatif%MOD;
			}else if(negatif==-1&&positif==-1){
				solve=negativewkwkwk();
				break;
			}else{
				pos.pop_back(); pos.pop_back();
				solve=solve*positif%MOD;
			}
			K-=2;
		}
	}else{
		if(pos.empty()){
			solve=negativewkwkwk();
		}else{
			solve=solve*pos.back();
			pos.pop_back();
			K--;
			while(K>0){
				ll negatif,positif;
				if(neg.size()>=2){
					negatif=neg[0]*neg[1];
				}else{
					negatif=-1;
				}
				if(pos.size()>=2){
					positif=pos[pos.size()-1]*pos[pos.size()-2];
				}else{
					positif=-1;
				}
				if(negatif>=positif){
					neg.erase(neg.begin()); neg.erase(neg.begin());
					solve=solve*negatif%MOD;
				}else if(negatif==-1&&positif==-1){
					solve=negativewkwkwk()%MOD;
					break;
				}else{
					pos.pop_back(); pos.pop_back();
					solve=solve*positif%MOD;
				}
				K-=2;
			}
		}
	}
	cout<<sixpackabs(solve)<<'\n';
}