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<(int)n;++i)
#define REP(i,a,b) for(int i=int(a);i<(int)b;++i)
#define pb push_back



using namespace std;
using ll = long long;
const ll mod = 1000000007;
const double PI = acos(-1);
const ll INF = 1e9;




int main(void)
{
    std::cin.tie(nullptr);
    std::ios::sync_with_stdio(false);
    ll n,k,numneg=0,num=1;
    cin >> n >> k;
    vector<pair<ll ,bool>> a(n);
    bool flag = true;
    if(n == k){
        rep(i,n){
            ll x;
            cin >> x;
            num = num*x%mod;
        }
        cout << num << endl;
        return 0;
    }
    rep(i,n){
        ll x;
        cin >> x;
        if(x >= 0){
            a[i].first = x;
            a[i].second = true;
            flag = false;
        }else{
            a[i].first = -x;
            a[i].second = false;
            numneg ++;
        }
    }

    sort(a.begin(),a.end());
    if(flag){
        rep(i,k){
            num = -num*a[i].first%mod;
        }
        if(num < 0)num += mod;
        cout << num << endl;
        return 0;
    }

    numneg = 0;
    ll pos=INF,neg=INF,numpos=0;
    rep(i,k){
        if(a[n-i-1].second){
            pos = n-i-1;
            numpos ++;
        }else{
            numneg ++;
            neg = n-i-1;
        }
    }
    if(numneg%2 == 0){
        rep(i,k){
            num = num*a[n-i-1].first%mod;
        }
        cout << num << endl;
        return 0;
    }
    ll pchan=-INF,nchan=-INF;
    for(ll i=n-k-1;i >= 0; i--){
        if(a[i].second && pchan == -INF){
            pchan = a[i].first;
        }else if(!a[i].second && nchan == -INF){
            nchan = a[i].first;
        }
    }
    if(!numpos){
        rep(i,k){
            if(n-i-1 != neg){
                num = num*a[n-i-1].first%mod;   
            }
        }
        num = num*pchan%mod;
        cout << num << endl;
        return 0;
    }
    if(pchan*a[pos].first >= nchan*a[neg].first){
        rep(i,k){
            if(n-i-1 != neg){
                num = num*a[n-i-1].first%mod;
            }
        }
        num = num*pchan%mod;
        cout << num << endl;
        return 0;
    }else{
        rep(i,k){
            if(n-i-1 != pos){
                num = num*a[n-i-1].first%mod;
            }
        }
        num = num*nchan%mod;
        cout << num << endl;
        return 0;
    }

    return 0;


}