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 rep(i, N) for(int i=0; i<N; i++)
typedef long long ll;
#define dump(x) cerr<<#x<<"="<<x<<endl
using P = pair<int, int>;

ll mod = 1e9+7;

int main() {
   ll n, k; cin >> n >> k;
   vector<ll> a(n);
   bool minus = true;
   rep(i, n){
      cin >> a.at(i);
      if(a.at(i)>=0) minus = false; 
   }

   if(minus){
      ll ans = 1;
      sort(a.begin(), a.end());
      if(k%2!=0){
         sort(a.rbegin(), a.rend());
      }
      rep(i, k){
         ans *= (mod+a.at(i));
         ans %= mod;
      }
      cout << ans << endl;
      return 0;
   }

   vector<pair<ll, ll>> c;
   rep(i, n){
      int tt = 1;
      if(a.at(i)<0) tt=0;
      c.push_back(make_pair((ll)abs(a.at(i)), tt));
   }

   sort(c.rbegin(), c.rend());
   ll ans1 = 1;
   int t = 1;
   rep(i, k){
      ans1 *= (c.at(i).first);
      ans1 %= mod;
      t ^= c.at(i).second;
      t = !t;
   }

   if(k==1){
      sort(a.rbegin(), a.rend());
      cout << a.at(0) << endl;
      return 0;
   }

   if(n==k){
      ll ans7 = 1;
      rep(i, n){
         ans7 *= (mod+a.at(i));
         ans7 %= mod;
      }
      cout << ans7 << endl;
      return 0;
   }

   if(t==1){
      cout << ans1 << endl;
      return 0;
   }
   else{
      bool minus1 = true;
      rep(i, k){
         if(c.at(i).second==1){
            minus1 = false;
         }
      }
      if(minus1){
         ll ans3 = 1;
         rep(i, k-1){
            ans3 *= (c.at(i).first);
            ans3 %= mod;
         }
         for(int i=k; i<n; i++){
            if(c.at(i).second){
               ans3 *= (c.at(i).first);
               ans3 %= mod;
               break;
            }
         }
         cout << ans3 << endl; 
         return 0;
      }
      else{
         ll ans4 = 1;
         ll ans5 = 1;
         int id0 = -1, id1 = -1;
         rep(i, k){
            if(c.at(i).second){
               id0 = i;
            }
            else{
               id1 = i;
            }
         }

         rep(i, k){
            if(i!=id0) ans4 *= (c.at(i).first); 
            if(i!=id1) ans5 *= (c.at(i).first);
            ans4 %= mod;
            ans5 %= mod;
         }

         for(int i=k; i<n; i++){
            if(c.at(i).second==0){
               ans4 *= (c.at(i).first);
               ans4 %= mod;
               break;
            }
         }
         
         for(int i=k; i<n; i++){
            if(c.at(i).second) {
               ans5 *= (c.at(i).first);
               ans5 %= mod;
               break;
            }
         }

         ll ans6 = max(ans4, ans5);
         cout << ans6 << endl;
         return 0;
      }
   }



   return 0;
}