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>
#define REP(i,n) for(int i=0;i<(n);++i)
#define ALL(v)   (v).begin(),(v).end()
#define debug(x) cerr<<#x<<": "<<(x)<<endl
#define INF      (int)1e9
#define EPS      (double)1e-9
#define MOD      ((int)1e9+7)
using namespace std;
typedef long long     llong;
typedef vector<int>   vi;
typedef vector<vi >   vvi;
typedef vector<vvi >  vvvi;
typedef pair<int,int> pii;
template<class Type> void line(const Type &a){int cnt=0;for(const auto &elem:a){if(cnt++)cerr<<' ';cout<<elem;}cerr<<endl;}

int main(){
	int n,k;
	cin>>n>>k;
	
	vi m,p;
	REP(i,n){
		int a;
		cin>>a;
		if(a<0) m.push_back(a);
		else p.push_back(a);
	}
	
	if(k==n){//全部選ぶ場合.
		llong ans=1;
		REP(i,m.size()) ans=ans*(MOD+m[i])%MOD;
		REP(i,p.size()) ans=ans*p[i]%MOD;
		cout<<ans<<endl;
		return 0;
	}
	
	if(m.size()==n and k%2==1){//全部負の数かつ奇数個選ぶ場合.
		llong ans=1;
		sort(ALL(m),greater<int>());//絶対値が小さくなるように.
		REP(i,k) ans=ans*(MOD+m[i])%MOD;
		cout<<ans<<endl;
		return 0;
	}
	
	auto comp=[](int x,int y){
		return abs(x)>abs(y);
	};
	sort(ALL(m),comp);
	sort(ALL(p),comp);
	
	llong ans=1;
	int mp=0, pp=0;
	while(k>0){
		if(k==1 or m.size()-mp<2 or(p.size()-pp>=2 and m[mp]*m[mp+1]<p[pp]*p[pp+1])){
			ans=ans*p[pp++]%MOD;
			k--;
		}else{
			REP(i,2) ans=ans*(MOD+m[mp++])%MOD;
			k-=2;
		}
	}
	
	cout<<ans<<endl;
}