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>
using namespace std;
#define int long long 
#define FAST ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

int MOD=1e9+7;

int32_t main(){
    FAST
    int n,k;cin>>n>>k;
    vector<int> p,ne;
    priority_queue<int> positive;
    priority_queue<int,vector<int>,greater<int>> negative;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        if(x>0){
            positive.push(x);
            p.push_back(x);
        }
        else{
            negative.push(x);
            ne.push_back(x);
        }
    }
    int ans=1;

    if(positive.size()==0){
        if(k&1){
            sort(ne.begin(),ne.end(),greater<int>());
            for(int i=0;i<k;i++){
                ans*=ne[i];
                ans%=MOD;
                ans=(ans+MOD)%MOD;
            }
            cout<<ans<<endl;
            return 0;
        }
        else{
            sort(ne.begin(),ne.end());
            for(int i=0;i<k;i++){
                ans*=ne[i];
                ans%=MOD;
                ans=(ans+MOD)%MOD;
            }
            cout<<ans<<endl;
            return 0;
        }
    }

    if(k&1){
        ans*=positive.top();positive.pop();
        k--;
    }
    

    while(k>0&&(positive.size()>=2)&&(negative.size()>=2)){
        
        int xp=positive.top();positive.pop();
        int yp=positive.top();positive.pop();

        int xn=negative.top();negative.pop();
        int yn=negative.top();negative.pop();

        if(xp*yp>xn*yn){
            int to_multiply=xp*yp;to_multiply%=MOD;
            ans=(ans*to_multiply)%MOD;
            negative.push(xn);
            negative.push(yn);
            k-=2;
        }
        else{
            int to_multiply=xn*yn;to_multiply%=MOD;
            ans=(ans*to_multiply)%MOD;
            positive.push(xp);
            positive.push(yp);
            k-=2;
        }

    }

    if(k==0){
        cout<<ans<<endl;
        return 0;
    }

    while(k>0&&positive.size()>=2){
        ans=(ans*positive.top())%MOD;positive.pop();
        ans=(ans*positive.top())%MOD;positive.pop();
        k-=2;
    }

    while(k>0&&negative.size()>=2){
        ans=(ans*negative.top())%MOD;negative.pop();
        ans=(ans*negative.top())%MOD;negative.pop();
        k-=2;
    }

    cout<<ans<<"\n";
    
    return 0;
}