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 Java (OpenJDK 11.0.6) (judge verdict: Wrong Answer)

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static long MOD = 1000000007;

	public static void main(String[] args) {
		try (Scanner sc = new Scanner(System.in);) {
			int n = sc.nextInt();
			int k = sc.nextInt();

			ArrayList<Long> a = new ArrayList<>(n);
			boolean containPlus = false;
			for (int i = 0; i < n; i++) {
				long value = sc.nextLong();
				if (value > 0) {
					containPlus = true;
				}
				a.add(value);
			}

			Collections.sort(a, new Comparator<Long>() {

				//絶対値の降順ソート
				@Override
				public int compare(Long o1, Long o2) {

					if (Math.abs(o1) > Math.abs(o2)) {
						return -1;
					} else if (Math.abs(o1) == Math.abs(o2)) {
						return 0;
					} else {
						return 1;
					}

				}
			});

			List<Long> selected = new ArrayList<>();
			if (k == n) {
				selected = a;
			} else if (containPlus == false && k % 2 == 1) {
				selected = a.subList(n - k, n);
			} else {

				int minusCount = 0;
				for (int i = 0; i < k; i++) {
					if (a.get(i) < 0) {
						minusCount++;
					}
				}

				if (minusCount % 2 == 0) {
					selected = a.subList(0, k);
				} else {
					selected = a.subList(0, k);

					//負の数を1つ取り除き、非負の数を1つ加える
					long x1 = Long.MAX_VALUE;
					for (int i = k - 1; 0 <= i; i--) {
						long value = a.get(i);
						if (value < 0) {
							x1 = value;
							break;
						}
					}
					long y1 = Long.MIN_VALUE;
					for (int i = k; i < n; i++) {
						long value = a.get(i);
						if (value > 0) {
							y1 = value;
							break;
						}
					}

					//正の数を1つ取り除き、負の数を1つ加える
					long x2 = Long.MIN_VALUE;
					for (int i = k - 1; 0 <= i; i--) {
						long value = a.get(i);
						if (value > 0) {
							x2 = value;
							break;
						}
					}
					long y2 = Long.MAX_VALUE;
					for (int i = k; i < n; i++) {
						long value = a.get(i);
						if (value < 0) {
							y2 = value;
							break;
						}
					}

					long v1 = Math.abs(x1 * y2);
					long v2 = Math.abs(x2 * y1);
					if (x1 == Long.MAX_VALUE || y1 == Long.MIN_VALUE || (v1 < v2)) {
						selected.remove(x2);
						selected.add(y2);
					} else if (x2 == Long.MIN_VALUE || y2 == Long.MAX_VALUE) {
						selected.remove(x1);
						selected.add(y1);
					} else {
						selected.remove(x2);
						selected.add(y2);
					}
				}
			}

			long result = 1;

			for (Long value : selected) {
				result = ((result * value) % MOD + MOD) % MOD;
			}
			System.out.println(result);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}