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: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmpnum(const void * n1, const void * n2) {
	if (*(long *)n1 > *(long *)n2)
	{
		return -1;
	}
	else if (*(long *)n1 < *(long *)n2)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int main(void) {

  long n,k;
  scanf("%ld %ld", &n, &k);
  long a[n];
  long plus = 0, zero = 0, minus = 0;
  for (long i = 0; i < n; i++) {
    scanf("%ld", &a[i]);
    if (a[i] > 0) {
      plus++;
    } else if (a[i] == 0) {
      zero++;
    } else {
      minus++;
    }
  }
  qsort(a, n, sizeof(long), cmpnum);
  long mod = pow(10,9)+7;
  long ans;
  long p_cur,m_cur,left,p_left,m_left;
  long tmp1,tmp2;

  if (plus+(minus/2*2) >= k) {
    ans = 1;
    p_cur = 0;
    m_cur = n-1;
    left = k;
    p_left = plus;
    m_left = minus/2*2;
    if (k%2 == 1) {
      if (plus == 0) {
        for (long i = plus+zero; i < plus+zero+k; i++) {
          ans *= -a[i];
          ans %= mod;
        }
        ans = (mod-ans)%mod;
        printf("%ld\n", ans);
        return 0;
      }
      ans = a[0];
      p_cur++;
      left --;
      p_left--;
    }
    while (1) {
      if (left == 0) {
        break;
      }
      if (p_left >= 2 && m_left >= 2) {
        tmp1 = a[p_cur]*a[p_cur+1];
        tmp2 = (-a[m_cur])*(-a[m_cur-1]);
        if (tmp2 > tmp1) {
          tmp2 %= mod;
          ans *= tmp2;
          ans %= mod;
          m_cur -= 2;
          left -= 2;
          m_left -= 2;
        } else {
          tmp1 %= mod;
          ans *= tmp1;
          ans %= mod;
          p_cur += 2;
          left -= 2;
          p_left -= 2;
        }
      } else if (m_left >= 2) {
        tmp2 = (-a[m_cur])*(-a[m_cur-1]);
        printf("%ld\n", tmp2);
        tmp2 %= mod;
        ans *= tmp2;
        ans %= mod;
        m_cur -= 2;
        left -= 2;
        m_left -= 2;
      } else if (p_left >= 2) {
        tmp1 = a[p_cur]*a[p_cur+1];
        tmp1 %= mod;
        ans *= tmp1;
        ans %= mod;
        p_cur += 2;
        left -= 2;
        p_left -= 2;
      }
    }
    printf("%ld\n", ans);
  } else {
    if (zero == 0) {
      ans = 1;
      for (long i = 0; i < n; i++) {
        if (a[i] > 0) {
          ans *= a[i];
          ans %= mod;
        } else {
          ans *= -a[i];
          ans %= mod;
        }
      }
      ans = (ans+mod)%mod;
      printf("%ld\n", ans);
    } else {
      printf("0\n");
    }
  }

  return 0;
}