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;
const int mod = 1e9+7;

int main() {
    
   int n, k, a;
   ll ans = 1;
   cin >> n >> k;
   vector<int> pos;
   vector<int> neg;
   for(int i = 0; i < n; ++i)
   {
        cin >> a;
        if(a >= 0)
            pos.push_back(a);
        else
            neg.push_back(a);
   }
   sort(pos.begin(), pos.end());
   sort(neg.begin(), neg.end());
   int ps = pos.size();
   int ns = neg.size();
   if(ns == 0)  // All elements are +ve
   {
       for(int i = ps-1; i >= ps-k ; --i)
       {
           ans = (ans*pos[i]%mod);
       }
   }
   else if(ps == 0) // All element are -ve
   {
       if((k&1) == 0) // K is even
       {
           for(int i = 0; i < k; ++i)
                ans = (ans*neg[i]%mod);
       }
       else  // k is odd
       {
           for(auto i : neg)
            cout << i << " ";
            cout << endl;
           for(int i = ns - 1; i >= ns-k ; --i)
                ans = (ans*neg[i]);
                ans = (ans%mod + mod)%mod;
       }
   }
   else  // Mixture of both +ve and -ve number
   {
       
        int l = 1;
        vector<int> arr;
        for(int i = ps - 1; i >= 0; --i)
            arr.push_back(pos[i]);
        
        for(int i = ns - 1; i >= 0; --i)
            arr.push_back(neg[i]);
       if(k >= n)
       {
           for(int i = 0; i < n; ++i)
            ans = ans*arr[i]%mod;
            ans = (ans%mod + mod)%mod;
            
       }
       else{
           
        if(k&1)
        {
            ans = arr[0];
            --k;
        }
        ll xx, yy;
        int r = n-1;
        while(k)
        {
            xx = arr[r]*arr[r-1]*1LL;
            yy = arr[l]*arr[l+1]*1LL;
            if(xx <= yy)
                ans = (ans*yy%mod), l += 2;
            else
                ans = (ans*xx%mod), r -= 2;
            
            k -= 2;
        }
       }
   }
   cout << ans;
}