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;
using ll=long long;
#define fr(i,n) for(int i=0;i<(n);++i)
#define Fr(i,n) for(int i=1;i<=(n);++i)
#define ifr(i,n) for(int i=(n)-1;i>=0;--i)
#define iFr(i,n) for(int i=(n);i>0;--i)
 
int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    ll a,ans,j,k,q,c;
    q=0;
    j=0;
    ans=1;
    cin>>a>>k;
    vector<ll> p;
    vector<ll> m;
    p.push_back(0);
    p.push_back(0);

    fr(i,a){
        ll b;
        cin>>b;
        if(b>0){
            p.push_back(b);
            }
        if(b<0) m.push_back(b);
        if(b=0) q++;
    }
    
    if(p.size()==2 and k%2==1){
        if(q!=0){cout<<0; exit(0);}
        else{sort(m.begin(), m.end());
        fr(i,k){
            ans*=m[m.size()-1];
            m.pop_back();
            ans=(1000000007-abs(ans)%1000000007);
        }}
        cout<<ans;
        exit(0);
    }
    m.push_back(0);
    m.push_back(0);
    sort(p.begin(), p.end());
    sort(m.begin(), m.end(),greater<ll>());
    if(a-q>=k){
    fr(i,k/2){
        {if(p[p.size()-1]*p[p.size()-2]>m[m.size()-1]*m[m.size()-2]){
            c=p[p.size()-1]*p[p.size()-2]%1000000007;
            ans*=c;
            p.pop_back();
            p.pop_back();
        }
        else {
            
            c=m[m.size()-1]*m[m.size()-2]%1000000007;
            ans*=c;
            m.pop_back();
            m.pop_back();
        }
        ans%=1000000007;}
    }
    if(k%2==1){
        ans*=p[p.size()-1];
        ans%=1000000007;
    }}
    else{ans=0;}
    cout<<ans;
}