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 <stdio.h>
#include <stdlib.h>
 
void merge_sort (int array[], int left, int right) {
  int i, j, k, mid;
  int work[200001];  // 作業用配列
  if (left < right) {
    mid = (left + right)/2; // 真ん中
    merge_sort(array, left, mid);  // 左を整列
    merge_sort(array, mid+1, right);  // 右を整列
    for (i = mid; i >= left; i--) { work[i] = array[i]; } // 左半分
    for (j = mid+1; j <= right; j++) {
      work[right-(j-(mid+1))] = array[j]; // 右半分を逆順
    }
    i = left; j = right;
    for (k = left; k <= right; k++) {
      if (work[i] < work[j]) { array[k] = work[i++]; }
      else                   { array[k] = work[j--]; }
    }
  }
}
 

int main(void){
    long long int waru=1000000007;
    int n;
    int k;
    scanf("%d %d",&n,&k);
    
    int a[200002]={0};
 
    for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    }
    
    merge_sort(a, 1, n);
    
    int minus=0;
    int zero=0;
    int plus=0;
    
    for(int i=1;i<=n;i++){
        if(a[i]<0){minus++;}
        if(a[i]==0){zero++;}
        if(a[i]>0){plus++;}
    }

    //printf("%d %d %d\n",minus,zero,plus);

    if(minus+plus<k){printf("0");return 0;}
    
    int plusmax=n;
    int minusmax=1;
    
    long long int ans=1;

if(k%2==1){
    if(plus==0){
    if(zero==0){
        for(int i=0;i<n;i++){
            ans*=a[n-i];
            //ans%=waru;
        }
        printf("%lld",ans);
    return 0;
    }else{
        printf("0");
        return 0;
    }
    
    
    
    
    
    
    
    
    
  
    }else{
    ans*=a[plusmax];
    plusmax--;
    }
}


for(int i=0;i<k/2;i++){
    if(plus>=2&minus>=2){
        if(a[plusmax]*a[plusmax-1]>a[minusmax]*a[minusmax+1]){
            ans*=(a[plusmax]*a[plusmax-1])%waru;
            ans%=waru;
            plusmax-=2;
        }else{
            ans*=(a[minusmax]*a[minusmax+1])%waru;
            ans%=waru;
            minusmax+=2;
        }
    }else if(plus>=2){
        ans*=(a[plusmax]*a[plusmax-1])%waru;
        ans%=waru;
        plusmax-=2;
    }else{
    ans*=(a[minusmax]*a[minusmax+1])%waru;
    ans%=waru;
    minusmax+=2;
    }
}


    printf("%lld",ans);
    
    return 0;
}