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)
using namespace std;
using ll = long long;
using P = pair<int,int>;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const ll INF = 1LL << 60;

//---main---------------------------------------------
int main(){
    //main
    int N,K;
    cin >> N >> K;

    vector<P> A(N);
    int Ai,pnum=0;
    rep(i,N){
        cin >> Ai;
        if(Ai==0){
            A[i] = P(0,0);
        }else if(Ai>0){
            A[i] = P(Ai, 1);
            pnum++;
        }else{
            A[i] = P(-Ai, -1);
        }
    }

    ll ans=1;
    int pm = 1;
    sort(A.begin(),A.end());
    //rep(i,N-1) cout << A[i].first << " " << A[i].second << endl;
    //cout << A[N-1].first << " " << A[N-1].second << endl;

    if(pnum == 0 && K%2==1){
        rep(i,K){
            ans = ans*ll(A[i].first);
            ans = ans%1000000007;
        }
        ans = -ans%1000000007;
        if(ans<0) ans += 1000000007;
    }else{
        rep(i,K-1){
            ans = ans*ll(A[N-1-i].first);
            ans = ans%1000000007;
            pm = A[N-1-i].second;
            //cout << i << ":" << ans << " " << pm << endl;
        }
        for(int i=K-1; i<N; ++i){
            if(A[N-1-i].second != -pm){
                ans = ans*ll(A[N-1-i].first);
                ans = ans%1000000007;            
                //cout << i << ":" << ans << " " << pm << endl;
                break;
            }
        }
    }

    cout << ans << endl;

    return 0;
}