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>
#include <ext/pb_ds/assoc_container.hpp> 
using namespace __gnu_pbds; 
using namespace std;
 
#define ff              first
#define ss              second
#define int             long long
#define pb              push_back
#define mp              make_pair
#define pii             pair<int,int>
#define vi              vector<int>
#define mii             map<int,int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define MX              200005
#define mod             1000000007
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define w(x)            int x; cin>>x; while(x--)
#define pw(b,p)         pow(b,p) + 0.1
mt19937                 rng(chrono::steady_clock::now().time_since_epoch().count());
 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
 
void codeforces()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
}
bool compare(int a, int b)
{
    if( abs(a) > abs(b)) return true;
    else return !true;
}
int32_t main()
{
    int n, k;
    cin>>n>>k;
    int a[n];
    int flag = 0;
    for(int i=0; i<n; i++){ 
        cin>>a[i];
        if( a[i] > 0) flag = 1;
    }
    if(flag == 0){
        sort(a, a+n, greater<int>());
        int ans = 1;
        for(int i=0; i<k; i++) ans*=a[i];
        cout<<(ans+mod)%mod;
        return 0;
    }
    if( k == n){
        int ans = 1;
        for(int i=0; i<k; i++){ 
            ans*=a[i];
            ans = (ans + mod)%mod;
        }
        cout<<(mod + ans)%mod;
        return 0;
    }
    sort(a, a+n, compare);
    int ans = 1;
    for(int i=0; i<k; i++){
        ans = ans*a[i];
        ans %= mod;
    }
    if( ans > 0) cout<<ans%mod;
    else{
        int x = 0, y = 0;
        for(int i=k; i<n; i++){
            if( a[i] < x) x = a[i];
            if( a[i] > y) y = a[i];
        }
        int maxi = 0;
        for(int i=0; i<k; i++){
            maxi = max({maxi, (ans*x)/a[i], (y*ans)/a[i]});
        }
        cout<<maxi%mod<<endl;
    }
    return 0;
}