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> 
#include <chrono>
using namespace std;
 
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}
 
 
//typedef
//------------------------------------------
typedef pair<int, int> PII;
typedef long long LL;
typedef pair<LL, LL> PLL;
 
//container util
//------------------------------------------
#define PB emplace_back
#define MP make_pair 
#define SZ(a) int((a).size())
//repetition
//------------------------------------------
#define FOR(i,a,b) for(LL i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define SORT(c) sort((c).begin(),(c).end())
#define ALL(a)  (a).begin(),(a).end()
//constant
//--------------------------------------------
//clear memory
#define CLR(a) memset((a), 0 ,sizeof(a))


int main(){
    int N,K;
    cin>>N>>K;
    vector<LL>A,Am;
    REP(i,N){
        LL tmp;cin>>tmp;
        if(tmp<0)Am.PB(tmp);
        else A.PB(tmp);
    }
    const LL mod=1e9+7;
    SORT(A);SORT(Am);
    if(SZ(A)==0&&K%2==1){
        LL res=1;
        REP(k,K)res=(res*Am[SZ(Am)-k-1]+2LL*mod)%mod;
        cout<<res<<endl;return 0;
    }else if(SZ(Am)<=1){
        LL res=1;
        REP(k,K)res=(res*A[SZ(A)-k-1]+2LL*mod)%mod;
        cout<<res<<endl;return 0;
    }
    int Knokori=K;
    LL resall=1;
    for(int i=0;i<SZ(Am)-1;i+=2){
        if(Knokori<=1)break;
        LL tmp=Am[i]*Am[i+1];
        int pcnt=K-2*i;//マイナスのやつが入る場合にバトルする相手
        if(SZ(A)-pcnt>=0&&SZ(A)-pcnt+1<SZ(A)&&A[SZ(A)-pcnt]*A[SZ(A)-pcnt+1]>tmp){
            break;
        }
        tmp%=mod;
        resall=tmp*resall%mod;
        Knokori-=2;
    }
    for(int pos=SZ(A)-1;pos>=0;pos--)if(Knokori>0){
        Knokori--;
        resall=resall*A[pos]%mod;
    }
    cout<<resall<<endl;
    return 0;
}