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: Runtime Error)

#include<bits/stdc++.h>
using namespace std;
using ll=int64_t;

int main(){
  ll n;
  cin >>n;
  ll k;
  cin >>k;
  vector<ll>ap;
  vector<ll>am;
  ll tmp;
  for(ll i=0;i<n;i++){
    cin >>tmp;
    if(tmp>=0)ap.push_back(tmp);
    else am.push_back(tmp);
  }
  sort(ap.begin(),ap.end());
  sort(am.begin(),am.end());
  
  if(ap.size()==0){
    ll ansneg=1;
    reverse(am.begin(),am.end());
    for(ll i=0;i<k;i++){
      ansneg*=am.at(i);
      ansneg=ansneg%1000000007;
    }
    if(ansneg<0)ansneg+=1000000007;
    cout <<ansneg<<endl;
    return 0;
  }
  
  vector<pair<ll,ll>>a;
  vector<ll>amn;
  ll ii=0;
  ll iimax=am.size();
  while(ii<=iimax-2){
    amn.push_back(am.at(ii)*am.at(ii+1));
    ii+=2;
  }
  ll imax=amn.size();
  for(ll i=0;i<imax;i++){
    a.push_back({amn.at(i),-1});
  }
  imax=ap.size();
  for(ll i=0;i<imax;i++){
    a.push_back({ap.at(i),1});
  }
  sort(a.begin(),a.end());
  reverse(a.begin(),a.end());
  ll count=k;
  ll ans=1;
  ll i=0;
  while(count>0){
    if(a.at(i).second==-1){
      if(count-2==-1){
        i++;
        continue;
      }
      else{
        ans*=a.at(i).first;
        ans%=1000000007;
        i++;
        count-=2;
      }
    }
    else{
      ans*=a.at(i).first;
      ans%=1000000007;
      i++;
      count-=1;
    }
    if(count==0)break;
  }
  if(ans<0){ans+=1000000007;}
  cout <<ans<<endl;
}