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.*;
import java.io.*;

public class Main{

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int k = in.nextInt();
		ArrayList<Integer> arr = new ArrayList<Integer>();
		boolean allneg = true;
		int mod=(int) (1e9+7);
		for(int i = 0; i < n; i++)
		{
			int x = in.nextInt();
			arr.add(x % mod);
			if(x > 0) allneg = false;
		}
		Collections.sort(arr, (a, b) -> compare(a, b));
		
		long sum = 1;
		if(allneg)
		{
			if(k % 2 == 1)
			{
				for(int i = n - 1; i >= n - k; i--)
				{
					sum *= arr.get(i);
					sum %= mod;
				}
			}
			else
			{
				for(int i = 0; i < k; i++)
				{
					sum *= arr.get(i);
					sum %= mod;
				}
			}
		}
		else
		{
			boolean pos = true;
			for(int i = 0; i < k - 1; i++)
			{
				sum *= arr.get(i);
				sum %= mod;
				if(arr.get(i) < 1) 
				{
					if(!pos) pos = true;
					else pos = false;
				}
			}
			if((pos && arr.get(k - 1) > 0) || (!pos && arr.get(k - 1) < 0)) sum *= arr.get(k - 1);
			else if(pos && arr.get(k - 1) < 0) 
			{
				for(int i = k - 1; i < arr.size(); i++)
				{
					if(arr.get(i) < 0) 
					{
						sum *= i;
						sum %= mod;
						break;
					}
				}
			}
			else if(!pos && arr.get(k - 1) > 0)
			{
				for(int i = k - 1; i < arr.size(); i++)
				{
					if(arr.get(i) > 0) 
					{
						sum *= i;
						sum %= mod;
						break;
					}
				}
			}
		}
		if(sum < 0) 
		{
			sum += mod;
			sum %= mod;
		}
		
		System.out.println(sum);
	}

	static int compare(int a, int b)
	{
		if(a < 0) a *= -1;
		if(b < 0) b *= -1;
		return b - a;
	}
}