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;
typedef long long ll;
#define REP(i, a, b) for(ll i=(a); i<(b); i++)
#define PER(i, a, b) for(ll i=(a); i>=(b); i--)
#define rep(i, n) REP(i, 0, n)
#define per(i, n) PER(i, n, 0)
#define ALL(a)  (a).begin(),(a).end()
const ll INF = 1e18+18;
const ll MAX = 200000;
const ll MOD = 1000000007;
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl;
#define YES(n) cout << ((n) ? "YES" : "NO") << endl;



int main(){
  ll N, K;
  cin>>N>>K;
  vector<ll> A(N);
  priority_queue<ll> B, S;
  ll ZeroCnt=0;
  ll Next=1;
  rep(i, N){
    cin>>A[i];
    if(A[i]>0)B.push(A[i]);
    if(A[i]<0)S.push(A[i]*-1);
    if(A[i]==0)ZeroCnt++;
  }
  if(ZeroCnt+K>N){
    cout<<0<<endl;
    return 0;
  }
  ll Ans=1;
  if(K%2){
    if(B.size()>0){
    Ans*=B.top();
    B.pop();
    K--;
    if(K==0){
      cout<<Ans<<endl;
      return 0;
    }
    }else{
      	if(ZeroCnt>0){
          cout<<0<<endl;
          return 0;
        }
      	else{
          sort(ALL(A));
          reverse(ALL(A));
          rep(i, K){
            Ans*=(A[i]+MOD);
            Ans%=MOD;
          }
          cout<<Ans<<endl;
          return 0;
        }
    }
  }
  
  ll Sz=B.size()/2+S.size()/2;
  if(Sz<K/2){
    if(ZeroCnt>0){
      cout<<0<<endl;
      return 0;
    }
    // 全て選ぶパターン？
    Ans=1;
    rep(i, N){
      Ans*=(A[i]+MOD);
      Ans%=MOD;
    }
    cout<<Ans<<endl;
    return 0;
  }
  ll Big=1;
  ll Small=1;
  if(B.size()>=2){
      Big=B.top();
      B.pop();
      Big*=B.top();
      B.pop();
  }
  if(S.size()>=2){
      Small=S.top();
      S.pop();
      Small*=S.top();
      S.pop();
  }
  if(Big>Small){
    Big%=MOD;
    Ans*=Big;
    Next=1;
  }
  else{
    Small%=MOD;
    Ans*=Small;
    Next=0;
  }
  Ans%=MOD;
  K-=2;
  while(K>0){
    if(Next&&B.size()>=2){
      Big=B.top();
      B.pop();
      Big*=B.top();
      B.pop();
    }else if(S.size()>=2){
      Small=S.top();
      S.pop();
      Small*=S.top();
      S.pop();
    }
    else{
      Big=B.top();
      B.pop();
      Big*=B.top();
      B.pop();
    }
    if(Big>Small){
    Big%=MOD;
    Ans*=Big;
    Next=1;
    }
    else{
    Small%=MOD;
    Ans*=Small;
    Next=0;
    }
    Ans%=MOD;
    K-=2;

  }
  cout<<Ans<<endl;
  return 0;
}