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: Time Limit Exceeded)

import java.util.*;
import java.math.*;
public class Main {
	
	public static long mod(long x, long m)
	{		
    return (x%m + m)%m;
	}
	
	public static void main(String[] args){
		
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int K = sc.nextInt();
		long div = 1000000007; 
		long ans = 1;
		
		List<Long> l1 = new ArrayList<>();
		List<Long> l2 = new ArrayList<>();
		List<Long> z = new ArrayList<>();
		
		
		for (int i = 0; i < N; i++) {
            long d = sc.nextLong();
			if (d < 0) {l2.add(d);}
			else {l1.add(d);}
		}
		int s1 = l1.size();

		int s2 = l2.size();
		
		if ((s1 == 0) && (K % 2 == 1))
		{
			Collections.sort(l2,Collections.reverseOrder());
			for (int i = 0; i < K; i++)
			{
				if(ans > div/2)
				{ans = ans - div;}
				ans *= l2.get(i);
				ans = mod(ans,div);
				
			}
			
			System.out.println(ans);
			return;
		}
		
		
		Collections.sort(l1,Collections.reverseOrder());
		Collections.sort(l2);
		

		
		if ( (K % 2 == 1))
		{
			ans *= l1.get(0);
			l1.remove(0);
			ans = mod(ans,div);
			K-=1;
		}
		
		
		while (K>1)
		{
			if ((l1.size() > 1) && (l2.size() > 1))
			{
			long mul_1 = l1.get(0)*l1.get(1);
			long mul_2 = l2.get(0)*l2.get(1);
			if ( mul_1 < mul_2 ){
				ans *= l2.get(0);
				l2.remove(0);
                ans = mod(ans,div);
              
                ans *= l2.get(0);
				l2.remove(0);
                ans = mod(ans,div);
				}else{
					ans *= l1.get(0);
				l1.remove(0);
                ans = mod(ans,div);
              
                ans *= l1.get(0);
				l1.remove(0);
                ans = mod(ans,div);
					}
					ans = mod(ans,div);
					K -= 2;	
             
			}
			else if ((l1.size() < 2) && (l2.size() > 1))
			{
				
				ans *= l2.get(0);
				l2.remove(0);
				ans = mod(ans,div);
                ans *= l2.get(0);
				l2.remove(0);
                ans = mod(ans,div);
              
				K -= 2;	
			}
			else if ((l2.size() < 2) && (l1.size() > 1))
			{
				ans *= l1.get(0);
				l1.remove(0);
				ans = mod(ans,div);
                ans *= l1.get(0);
				l1.remove(0);
                ans = mod(ans,div);
              
				K -= 2;	
			}
			else
			{
				long mul = l1.get(0)*l2.get(0);
                ans *= l1.get(0);
				l1.remove(0);
				ans = mod(ans,div);
              
                ans *= l2.get(0);
				l2.remove(0);
				ans = mod(ans,div);
				
				System.out.println(ans);
				return;
			}
		}

		System.out.println(ans);

	}
}