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 <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <algorithm>
#include <set>
#include <iomanip>
#include <stdio.h>
#include <sstream>
#include <bits/stdc++.h>
using namespace std;
int main(void){
  long long int n,k;
  cin>>n>>k;
  long long int mod=pow(10,9)+7;
  vector<long long int> plus;
  vector<long long int> minus;
  for(long long int i=0; i<n; i++){
    long long int x;
    cin>>x;
    if(x<0){
      minus.push_back(x);
    }else{
      plus.push_back(x);
    }
  }
  sort(minus.begin(),minus.end());
  sort(plus.begin(),plus.end());
  reverse(plus.begin(),plus.end());
  long long int mcount=0;
  long long int pcount=0;
  long long int ans=1;
  for(long long int i=0; i<k; i++){
    if(mcount==minus.size()){
      ans*=plus.at(pcount);
      ans%=mod;
      pcount++;
      continue;
    }
    if(pcount==plus.size()){
      ans*=minus.at(minus.size()-mcount-1);
      mcount++;
      ans%=mod;
      continue;
    }
    if(k-2>=i){
      if(mcount!=minus.size()-1){
        if(minus.at(mcount)*minus.at(mcount+1)>=plus.at(pcount)*plus.at(pcount+1)){
          long long int pre=minus.at(mcount)*minus.at(mcount+1);
          pre%=mod;
          ans*=pre;
          ans%=mod;
          mcount+=2;
          i++;
        }else{
          ans*=plus.at(pcount);
          ans%=mod;
          pcount++;
        }
      }else{
        ans*=plus.at(pcount);
        ans%=mod;
        pcount++;
      }
    }else{
      ans*=plus.at(pcount);
      ans%=mod;
      pcount++;
    }
  }
  ans%=mod;
  if(ans<0){
    ans+=mod;
  }
  cout<<ans<<endl;
}