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++ (Clang 10.0.0) (judge verdict: Runtime Error)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

//  a^b % m
long long powmod(long long a, long long b, long long m)
{
    long long r = 1;
    for (; b>0; b>>=1, a=a*a%m)
        if (b&1)
            r = r*a%m;
    return r;
}

int main()
{
    int N, K;
    cin>>N>>K;

    vector<long long> A(N);
    for (long long &a: A)
        cin>>a;

    sort(A.begin(), A.end(), [&](long long a, long long b){return abs(a)>abs(b);});

    long long ans = 1;
    long long M = 1000000007LL;

    bool allneg = true;
    for (int a: A)
        if (a>=0)
            allneg = false;
    if (allneg && K%2!=0)
    {
        for (int i=0; i<K; i++)
            ans = (ans*A[N-i-1]%M+M)%M;
    }
    else
    {
        int sign = 1;
        for (int i=0; i<K; i++)
        {
            ans = (ans*A[i]%M+M)%M;
            sign *= (A[i] > 0 ? 1 : A[i] < 0 ? -1 : 0);
        }

        if (sign < 0)
        {
            long long t00 = -1;
            for (int i=K-1; i>=0 && t00==-1; i--)
                if (A[i]>0)
                    t00 = i;
            long long t01 = -1;
            for (int i=K; i<N && t01==-1; i++)
                if (A[i]<0)
                    t01 = i;
            long long t10 = -1;
            for (int i=K-1; i>=0 && t10==-1; i--)
                if (A[i]<0)
                    t10 = i;
            long long t11 = -1;
            for (int i=K; i<N && t11==-1; i++)
                if (A[i]>0)
                    t11 = i;

            if (t00!=-1 && t01!=-1 && t10!=-1 && t11!=-1 && abs(A[t00]*A[t01])>abs(A[t10]*A[t11]) ||
                t00!=-1 && t01!=-1 && !(t10!=-1 && t11!=-1))
            {
                ans = ans*powmod((A[t00]%M+M)%M, M-2, M)%M;
                ans = (ans*A[t01]%M+M)%M;
            }
            else if (t10!=-1 && t11!=-1)
            {
                return -1;
                ans = ans*powmod((A[t10]%M+M)%M, M-2, M)%M;
                ans = (ans*A[t11]%M+M)%M;
            }
            else
            {
                for (long long a: A)
                    if (a==0)
                        ans = 0;
            }
        }
    }
    cout<<ans<<endl;
}