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;
#define mod 1000000007;
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    long long int b[200001],c[200001];
    long long int n,k,x,y,z,i,j,l;
    cin>>n>>k;
    x=0;
    y=0;
    for(long long int i=0; i<n; i++)
    {
        cin>>z;
        if(z<0)
            c[y++]=z;
        else
            b[x++]=z;
    }
    z=1;
    sort(c,c+y);
    sort(b,b+x);
    bool o=1;
    if(k<=x)
    {
        o=0;
    }
    else if((k-x)%2==0)
    {
        o=0;
    }
    else if(x>=1&&(k-x+1)<=y)
    {
        o=0;
    }
    if(o)
    {
        z=c[y-1];
        z%=mod;
        i=0;
        j=1;
        l=1;
        while(l<k)
        {
            if(i>=x)
            {
                z*=c[y-1-j]*c[y-2-j];
                z%=mod;
                l+=2;
                j+=2;
            }
            else if(j+1>=y)
            {
                z*=b[i];
                z%=mod;
                l+=1;
                i+=1;
            }
            else if(k-l>=2)
            {
                if(c[y-1-j]*c[y-2-j]<b[i])
                {
                    z*=c[y-1-j]*c[y-2-j];
                    z%=mod;
                    l+=2;
                    j+=2;
                }
                else
                {
                    z*=b[i];
                    z%=mod;
                    l+=1;
                    i+=1;
                }
            }
            else
            {
                z*=b[i];
                z%=mod;
                l+=1;
                i+=1;
            }
        }
        z+=mod;
    }
    else
    {
        z=1;
        i=x-1;
        j=0;
        l=0;
        while(l<k)
        {
            if(i<0)
            {
                z*=c[y-1-j]*c[y-2-j];
                z%=mod;
                l+=2;
                j+=2;
            }
            else if(j+1>=y)
            {
                z*=b[i];
                z%=mod;
                l+=1;
                i-=1;
            }
            if(k-l>=2)
            {
                if(c[j]*c[j+1]>=b[i])
                {
                    z*=c[j]*c[j+1];
                    z%=mod;
                    l+=2;
                    j+=2;
                }
                else
                {
                    z*=b[i];
                    z%=mod;
                    l+=1;
                    i-=1;
                }
            }
            else
            {
                z*=b[i];
                z%=mod;
                l+=1;
                i-=1;
            }
        }
    }
    cout<<z<<endl;
    return 0;
}