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>
#define swap(type, x, y) do{ type t = x; x = y; y = t; }while(0)

void quick(long a[], long left, long right){
  long pl = left, pr = right, x = a[(left+right)/2];
  do{
    while(a[pl] > x)  pl++;
    while(a[pr] < x)  pr--;
    if(pl <= pr){
      swap(long, a[pl], a[pr]);
      pl++, pr--;
    }
  }while(pl <= pr);
  if(pl < right)  quick(a, pl, right);
  if(pr > left)   quick(a, left, pr);
}

int main(){
  long ans = 0, idx, mod = 1e9+7;
  int n, k;  scanf("%d %d", &n, &k);
  long zeros = 0, plus[200005] = {0}, minus[200005] = {0};
  long twos[100005] = {0}, ones[100005] = {0};
  for(int i=1; i<=n; i++){
    long a;  scanf("%ld", &a);
    if(a > 0)  plus[++plus[0]] = a;
    else if(a < 0)  minus[++minus[0]] = -a;
    else  zeros++;
  }
  quick(plus, 1, plus[0]);
  quick(minus, 1, minus[0]);
  int pidx = 1, midx = 1;
  while(idx<k){  // && pidx<plus[0] && midx<minus[0]){
    if(pidx>=plus[0] || plus[pidx]*plus[pidx+1] <= minus[midx]*minus[midx+1]){
      ans = (ans * (minus[midx]*minus[midx+1])%mod) % mod;
      midx += 2;
    }else if(midx>=minus[0] || plus[pidx]*plus[pidx+1] > minus[midx]*minus[midx+1]){
      ans = (ans * (plus[pidx]*plus[pidx+1])%mod) % mod;
      pidx += 2;
    }
    idx += 2;
  }
  if(idx != k){
    while(idx < k && pidx <= plus[0]){
      ans = (ans * plus[pidx++]) % mod;
      idx++;
    }
    if(idx < k){
      ans = 0;
      if(idx+zeros < k)
	while(idx+zeros<k){
	  ans = (ans * -minus[midx++])%mod;
	  idx++;
	}
    }
  }
  ans = (ans + mod) % mod;  
  printf("%ld\n", ans);
  return 0;
}