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: Accepted)

#include <bits/stdc++.h>

using namespace std;
#define all(x) x.begin(), x.end()

const int N = 200000 + 10;
const int MOD = 1000000000 + 7;

vector <long long> a, b, c;

int main() {
    int n, k;   cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        long long x;    cin >> x;
        if (x > 0)  a.push_back(x);
        else if (x < 0) b.push_back(x);
        else    c.push_back(x);
    }
    sort(all(a), [&](long long a, long long b){return a > b; });
    sort(all(b));
    sort(all(c));

    if (k == n) {
        long long ans = 1;
        for (auto x : a)    ans = ans * x % MOD;
        for (auto x : b)    ans = ans * x % MOD;
        for (auto x : c)    ans = ans * x % MOD;
        ans = (ans + MOD) % MOD;
        cout << ans;
    }
    else {
        if (a.size() + b.size() < k) {
            cout << 0;
        }
        else {
            if (a.empty()) {
                long long ans = 1;
                if (k & 1) {
                    if (c.empty()) {
                        for (int i = 1; i <= k; i++)    ans = ans * b[b.size() - i] % MOD;
                    }
                    else {
                        cout << 0;
                        return 0;
                    }
                }
                else    for (int i = 0; i < k; i++) ans = ans * b[i] % MOD;
                ans = (ans + MOD) % MOD;
                cout << ans;
            }
            else {
                if (b.size() & 1)   b.pop_back();
                long long ans = 1, p = 0, q = 0;
                if (k & 1)  ans = a[p++], k--;
                while (k) {
                    if (q + 2 > b.size() || (a[p] * a[p + 1] > b[q] * b[q + 1])) {
                        ans = ans * (a[p] * a[p + 1] % MOD) % MOD;
                        p += 2;
                    }
                    else {
                        ans = ans * (b[q] * b[q + 1]  % MOD) % MOD;
                        q += 2;
                    }
                    k -= 2;
                }
                cout << ans;
            }
        }
    }

#ifndef ONLINE_JUDGE
    system("pause");
#endif
    return 0;
}