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>

//#pragma GCC optimize("Ofast")

#define fi first
#define se second
#define ll long long
#define dl double long

using namespace std;

const int NN = 1e9 + 7;
const int N = 2e5 + 7;
const int M = 26;
const ll mod = 1e9 + 7;
const int inf = 1e9 + 7;
const dl rf = 1e-14;
const int B = sqrt(N);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n,k;
ll a[N];

void solve1()
{
    cin >> n >> k;
    vector < ll > A , B;
    ll ans = 1;
    for( int i = 1; i <= n; i++ ){
        cin >> a[i];
        if( a[i] < 0 )A.push_back( -a[i] );
        else B.push_back( a[i] );
        ans = ans * a[i];
        ans %= mod;
    }
    if( n == k ){
        cout << (ans + mod) % mod;
        return;
    }
    ans = 1;
    if( (int)A.size() + (int)B.size() < k ){
        cout << 0;
        return;
    }
    sort( A.rbegin() , A.rend() );
    sort( B.rbegin() , B.rend() );
    if( B.empty() ){
        if( k % 2 )reverse( A.begin() , A.end() );
        for( int i = 0; i < k; i++ ){
            ans *= -A[i];
            ans %= mod;
        }
        cout << (ans + mod) % mod;
    }else{
        swap( A , B );
        int n1 = (int)A.size();
        int n2 = (int)B.size();
        int i = 0 , j = 0 , s = 0;
        while( s < k ){
            s += 1;
            if( s == k ){
                ans *= A[i];
                ans %= mod;
                break;
            }
            if( i + 1 < n1 && j + 1 < n2 ){
                if( A[i] * A[i + 1] > B[j] * B[j + 1] ){
                    ans *= A[i] * A[i + 1] % mod;
                    ans %= mod;
                    s += 1;
                    i += 2;
                }else{
                    ans *= B[i] * B[i + 1] % mod;
                    ans %= mod;
                    s += 1;
                    j += 2;
                }
            }else{
                if( j + 1 < n2 ){
                    if( i < n1 && A[i] > B[j] * B[j + 1] ){
                        ans *= A[i];
                        ans %= mod;
                        i += 1;
                    }else{
                        ans *= B[j] * B[j + 1] % mod;
                        s += 1;
                        ans %= mod;
                        j += 1;
                    }
                }else{
                    ans *= A[i];
                    ans %= mod;
                    i += 1;
                }
            }
        }
        cout << (ans + mod) % mod;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    //freopen( "input.txt" , "r" , stdin );
    //freopen( "output.txt" , "w" , stdout );

    int cghf = 1;//cin >> cghf;
    while( cghf-- ){
        solve1();
    }
}