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 <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
typedef long long LL;
typedef long double Lf;
#define Rep(i,a,n)for(int i=(int)(a);i<(int)(n);i++)
#define rep(i,n)Rep(i,0,n)
#define Ma(x,y) ((x)>(y)?(x):(y))
#define mi(x,y) ((x)<(y)?(x):(y))
#define MOD 1000000007
int acs(const void* a, const void* b) { return *(int*)a - *(int*)b; } // 1,2,3,4
int des(const void* a, const void* b) { return *(int*)b - *(int*)a; } // 8,7,6,5
int cmp_char(const void* a, const void* b) { return *(char*)a - *(char*)b; } // a,b,c,d
int cmp_str(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); } // aaa,aab
//snippet
#define N 109

int acsLL(const void* a, const void* b) { return*(LL*)a<*(LL*)b ? -1 : *(LL*)a> * (LL*)b ? 1 : 0; }

int main() {
	LL n, k, p[N], m[N], pl = 0, mn = 0, ans = 1, t;
	scanf("%lld%lld", &n, &k);
	rep(i, n) {
		scanf("%lld", &t);
		if (t >= 0)p[pl++] = t;
		else m[mn++] = -t;
	}
	qsort(p, pl, sizeof(LL), acsLL);
	qsort(m, mn, sizeof(LL), acsLL);


	if (n == k) {//all
		rep(i, mn)ans = ans * (MOD - m[i]) % MOD;
		rep(i, pl)ans = ans * p[i] % MOD;
	}
	else if (mn == n && k % 2) {//-
		rep(i, k)ans = ans * (MOD - m[i]) % MOD;
	}
	else {//normal
		while (k) {
			if (k >= 2 && mn >= 2 && (pl <= 1 || (pl >= 2 && m[mn - 1] * m[mn - 2] >= p[pl - 1] * p[pl - 2]))) {
				ans = ans * m[--mn] % MOD;
				ans = ans * m[--mn] % MOD;
				k = k - 2;
			}
			else {
				ans = ans * p[--pl] % MOD;
				k--;
			}
		}
	}
	printf("%lld", ans);
}