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<iostream>
#include<math.h>
#include<algorithm>
#include<stdint.h>
#include<vector>
#include<deque>
#include<stack>
#include<functional>
#include<string>
#include<cstring>
#include<time.h>
#include<array>
#include<iomanip>
#include<list>
#include<set>
#include<unordered_map>
#include<unordered_set>
#include<random>
#include<bitset>
#include <queue>
#include <map>


using namespace std;
using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
using ldouble = long double;


//BDD,ZDD,kdtree, bdtree,bicalc, bolonoy, doloney, tree, chinesemod,segmenttree,daikusutora, saidairyuu, 2bugurahu, heirokenshutu, topologicalsort, kyourenketuseibun

#define REP(i,a,b) for(int i = a; i < b; ++i)
#define PRI(s) cout << s << endl
#define PRIY PRI("Yes")
#define PRIN PRI("No")

ll N, K;
vector<ll> a;
vector<ll> ap;
vector<ll> am;
ll MOD = 1000000007;

ll mod(ll x) { return (x%MOD + MOD) % MOD; }
int main() {
	cin >> N >> K;
	a.resize(N);
	REP(i,0, N) {
		cin >> a[i];
		if (a[i] >= 0)ap.push_back(a[i]);
		else am.push_back(a[i]);
	}

	bool minus = false;
	int ccc = 0;
	while (ccc + 2 <= K && ccc + 2 <= am.size()) ccc += 2;
	if (ccc + ap.size() < K) minus = true;
	if (minus) {
		sort(a.begin(), a.end(), [](ll x, ll y) {return abs(x) < abs(y); });
		ll ret = 1;
		REP(i, 0, K) ret = mod(ret * a[i]);
		PRI(ret);
		return 0;
	}
	sort(ap.begin(), ap.end(), greater<ll>());
	sort(am.begin(), am.end(), less<ll>());
	vector<ll> pick(K);
	REP(i, 0, K) pick[i] = i < a.size() ? ap[i] : 0;
	sort(pick.begin(), pick.end(), less<ll>());
	for (int i = 0; i + 1 < K && i + 1 < am.size(); i += 2) {
		if (pick[i] * pick[i + 1] < am[i] * am[i + 1]) {
			pick[i] = am[i];
			pick[i + 1] = am[i + 1];
		}
		else break;
	}
	ll ret = 1;
	REP(i, 0, K) ret = mod(ret * pick[i]);
	PRI(ret);
	return 0;
}