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>
using namespace std;
int a[100005];
int zheng[100005];
int ffu[100005];
const long long mod=1e9+7;
bool cmp(int a,int b){
    return abs(a)>abs(b);
}

int n,k;
int main()
{
    scanf("%d%d",&n,&k);
    int s1=0,s2=0,kk=k;
    for(int i=0;i<n;i++)
	{
        scanf("%d",&a[i]);
        if(a[i]>0){
           zheng[s1]=a[i];s1++;
		   }
        if(a[i]<0){
           ffu[s2]=a[i];s2++;
		   }
    }
    sort(zheng,zheng+s1,cmp);
    sort(ffu,ffu+s2,cmp);
    long long ans=1;
    int ss1=0,ss2=0;
    while(true)
	{
        if(k==0)
           break;
        if(abs(zheng[ss1])>abs(ffu[ss2]))
		{
            ans=(ans*zheng[ss1])%mod;
            ss1++;
            k--;
        }
        else
		{
            ans=(ans*ffu[ss2])%mod;
            ss2++;
            k--;
        }
    }
    if(ans>0){
    printf("%lld\n",ans%mod);
    return 0;
    }
     if(ans>0){
    printf("%lld\n",ans%mod);
    return 0;
    }
    if(ans<0&&s1>0)
	{
        long long ans1=1;
        if(ss1<s1)
        ans1=(ans/ffu[ss2-1])*zheng[ss1]%mod;
        if(ss2<s2)
        ans=(ans/zheng[ss1-1])*ffu[ss2]%mod;
        printf("%lld",max(ans1,ans)%mod);
        return 0;
    }
    if(ans<0&&s1==0)
	{
        sort(ffu,ffu+s2);
        long long ans2=1;
        for(int i=s2-1;i>=0;i--)
            ans2=(ffu[i]*ans2%mod);
        printf("%lld",ans2%mod);
    }
    return 0;
}