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 int long long
#define pii pair<int,int>
#define F first
#define S second
#define mod 1000000007
using namespace std;
priority_queue<pii>pq ;
priority_queue<int>ng ;
stack<int>st ;
int ar[200009],ans=1 ;
int32_t main()
{
    ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0) ;
    int n,k,f=0,tt=0 ;
    cin>>n>>k ;
    for(int i = 0 ; i < n ; i++)
    {
        cin>>ar[i] ;
        if(ar[i]>=0) {pq.push({ar[i],0}) ; tt++ ;}
        else {pq.push({ar[i]*-1,1}) ; ng.push(ar[i]) ;  }
    }
    int ct=0,c1=0 ;
    while(k)
    {
        //cout<<k<<endl ;
        pii p1=pq.top() ;
        if(p1.S)
        {
            int pr=p1.F ;
            st.push(pr) ; ct++ ;
        }
        else {ans*=(p1.F%mod) ; ans%=mod ; c1++ ; }
        pq.pop() ; k-- ;
    }
    //cout<<ct<<" "<<ans<<endl ;
    int fl=0 ;
    if(ct%2)
    {
        while(!pq.empty())
        {
            pii p1=pq.top() ; pq.pop() ;
            if(!p1.S)
            {
                ans*=(p1.F%mod) ; ans%=mod ;
                st.pop() ; fl=1 ; break ;
            }
        }
    }
    else fl=1 ;
    //cout<<ans<<endl ;
    if(fl){
    while(!st.empty())
    {
        int x=st.top()*-1 ; st.pop() ;
       // cout<<x<<" " ;
        x=(x+mod)%mod ;
        //cout<<x<<endl ;
        ans=((ans%mod)*(x%mod))%mod ; ans+=mod ; ans%=mod ;
        //cout<<"ans "<<ans<<endl ;
    }
    }
    else
    {
        while(ct--)
        {
            int x=ng.top() ; ng.pop() ;
            x=(x+mod)%mod ;
            ans=((ans%mod)*(x%mod))%mod ; ans+=mod ; ans%=mod ;
        }
    }
    cout<<ans%mod<<endl ;
}