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,a,b) for(ll i=ll(a);i<ll(b);i++)
#define irep(i,a,b) for(ll i=ll(a);i>=ll(b);i--)
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
#define pb push_back
#define mp make_pair
#define F .first
#define S .second 
#define pll pair<ll,ll>
using ll=long long;
using ld=long double;
const ll INF = 1LL<<60;
const ll mod=1e9+7;
using namespace std;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

ll a[220000];
vector<ll> m;
int main(){
    ll n,k,ans=0,pos0=0,pos1=0;
    cin>>n>>k;
    rep(i,0,n)cin>>a[i];
    sort(a,a+n);
    bool allm=false;
    if(a[n-1]<0)allm=true;

    if(allm&&k%2==1){
        ll tmp=1;
        irep(i,n-1,n-k){
            tmp=(tmp*a[i])%mod;
        }
        cout<<(mod+tmp)%mod;
    }
    else{
    for(int i=0;i<n;i+=2){
        if(a[i+1]>=0){pos0=i;break;}
        else m.pb(a[i]*a[i+1]);
    }
    for(int i=n-1;i>=0;i-=2){
        if(a[i-1]<0){pos1=i;break;}
        else m.pb(a[i]*a[i-1]);
    }
    sort(m.rbegin(),m.rend());
    if(k%2==0){
        ll tmp=1;
        rep(i,0,k/2)tmp=(tmp*(m[i]%mod))%mod;
        if(m.size()*2<k)tmp=(tmp*(a[pos1]*a[pos0])%mod);
        cout<<(mod+mod%tmp)%mod<<endl;
    }
    else{
        ll tmp=1;
        rep(i,0,k/2)tmp=(tmp*(m[i]%mod))%mod;
        tmp=(tmp*a[pos1])%mod;
        cout<<(mod+mod%tmp)%mod;
    }
    }
   
}