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.*;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int k = sc.nextInt();
    long MOD = (long)Math.pow(10, 9) + 7;
    long[] a = new long[n];
    int zero = 0;
    ArrayList<Long> list1 = new ArrayList<Long>();
    ArrayList<Long> list2 = new ArrayList<Long>();
    for(int i = 0; i < n; i++) {
      a[i] = sc.nextLong();
      if(a[i] >= 0) {
        list1.add(a[i]);
      } else {
        list2.add(a[i]);
      }
      if(a[i] == 0) zero++;
    }
    Collections.sort(list1);
    Collections.sort(list2);
    long ans = 1;
    if(list1.size() == 0) {
      if((k % 2) == 1) {
        for(int i = list2.size() - 1; i >= list2.size() - k; i--) {
          long d = list2.get(i);
          d += MOD;
          ans = (ans * d) % MOD;
        }
      } else {
        for(int i = 0; i < k; i++) {
          long d = list2.get(i);
          d += MOD;
          ans = (ans * d) % MOD;
        }
      }
    } else if(list2.size() == 0) {
      for(int i = list1.size() - 1; i >= list1.size() - k; i--) {
        ans = (ans * list1.get(i)) % MOD;
      }
    } else {
      if(k == n) {
        for(int i = 0; i < n; i++) {
          if(a[i] >= 0) {
            ans = (ans * a[i]) % MOD;
          } else {
            long d = a[i] + MOD;
            ans = (ans * d) % MOD;
          }
        }
      } else {
        if((list1.size() + list2.size() - zero) > k) {
          int p1 = list1.size() - 1;
          int p2 = 0;
          if((k % 2) == 0) {
            for(int i = 0; i < k; i++) {
              if(p1 >= 0) {
                if(i == (k - 1)) {
                  ans = (ans * list1.get(p1)) % MOD;
                  p1--;
                } else {
                  if(p2 >= (list2.size() - 1)) {
                    ans = (ans * list1.get(p1)) % MOD;
                    p1--;
                  } else {
                    long t1 = list1.get(p1);
                    if(p1 > 0) t1 *= list1.get(p1 - 1);
                    long t2 = list2.get(p2) * list2.get(p2 + 1);
                    if(t1 >= t2) {
                      ans = (ans * list1.get(p1)) % MOD;
                      p1--;
                    } else {
                      ans = (ans * t2) % MOD;
                      i++;
                      p2 += 2;
                    }
                  }
                }
              } else {
                long d = list2.get(p2) + MOD;
                ans = (ans * d) % MOD;
                p2++;
              }
            }
          } else {
            ans = list1.get(p1);
            p1--;
            for(int i = 1; i < k; i++) {
              if(p1 >= 0) {
                if(i == (k - 1)) {
                  ans = (ans * list1.get(p1)) % MOD;
                  p1--;
                } else {
                  if(p2 >= (list2.size() - 1)) {
                    ans = (ans * list1.get(p1)) % MOD;
                    p1--;
                  } else {
                    long t1 = list1.get(p1);
                    if(p1 > 0) t1 *= list1.get(p1 - 1);
                    long t2 = list2.get(p2) * list2.get(p2 + 1);
                    if(t1 >= t2) {
                      ans = (ans * list1.get(p1)) % MOD;
                      p1--;
                    } else {
                      ans = (ans * t2) % MOD;
                      i++;
                      p2 += 2;
                    }
                  }
                }
              } else {
                long d = list2.get(p2) + MOD;
                ans = (ans * d) % MOD;
                p2++;
              }
            }
          }
        } else if((list1.size() + list2.size() - zero) == k) {
          if((list2.size() % 2) == 0) {
            for(int i = 0; i < list2.size(); i++) {
              long d = list2.get(i) + MOD;
              ans = (ans * d) % MOD;
            }
            for(int i = 0; i < list1.size(); i++) {
              ans = (ans * list1.get(i)) % MOD;
            }
          } else {
            if(zero > 0) {
              ans = 0;
            } else {
              for(int i = 0; i < n; i++) {
                if(a[i] >= 0) {
                  ans = (ans * a[i]) % MOD;
                } else {
                  long d = a[i] + MOD;
                  ans = (ans * d) % MOD;
                }
              }
            }
          }
        } else {
          ans = 0;
        }
      }
    }
    System.out.println(ans);
  }
}