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 PHP (7.4.4) (judge verdict: Wrong Answer)

<?php
  $m = 1000000007;
  list($n, $k) = explode(" ", trim(fgets(STDIN)));

  $a = array_map('intval', explode(" ", trim(fgets(STDIN))));

  $pl = [];
  $mi = [];
  $ze = [];
  for ($i=0; $i<$n; $i++) {
    if($a[$i] > 0){
      $pl[] = $a[$i];
    }else if($a[$i] === 0){
      $ze[] = $a[$i];
    }else{
      $mi[] = $a[$i];
    }
  }

  if(count($ze) !== 0){
    if($k > count($pl)+count($mi)){
      echo "0";
      exit;
    }
    if($k <= count($pl)+count($mi)){
      if(count($mi) % 2 !== 0){
        echo "0";
        exit;
      }
    }
  }

  if(count($ze) == 0 && count($pl) == 0){
    if($k % 2 == 0){
      sort($mi);
    }else{
      rsort($mi);
    }
    $ans = 1;
    for ($i=0; $i<$k; $i++) {
      $ans = $ans * $mi[$i] % $m;
    }
    if($ans < 0) $ans = $m + $ans;
    echo $ans;
    exit;
  }

  if($k == 1) {
    rsort($a);
    $ans = $a[0] % $m;
    if($ans < 0) $ans = $m + $ans;
    echo $ans;
    exit;
  }
    

  rsort($pl);
  sort($mi);

  $micnt = count($mi);
  $migu = ($micnt % 2 !== 0);
  $miset = [];
  for ($i=0; $i<$micnt-1; $i=$i+2) {
    $miset[] = $mi[$i] * $mi[$i+1];
  }

  $plcnt = count($pl);
  $plgu = ($plcnt % 2 !== 0);
  $plset = [];
  for ($i=0; $i<$plcnt-1; $i=$i+2) {
    $plset[] = $pl[$i] * $pl[$i+1];
  }

  $kgu = ($k % 2 == 0);
  $plidx = 0;
  $miidx = 0;

  $ans = 1;
  for ($i=0; $i<$k-1; $i=$i+2) {
    if($miidx >= count($miset)){
      $ans = $ans * ($plset[$plidx] % $m) % $m;
//      echo $ans.PHP_EOL;
      $plidx++;
    }else if($plidx >= count($plset)){
      $ans = $ans * ($miset[$miidx] % $m) % $m;
//      echo $ans.PHP_EOL;
      $miidx++;
    }else{
      if($plset[$plidx] > $miset[$miidx]){      
        $ans = $ans * ($plset[$plidx] % $m) % $m;
//      echo $ans.PHP_EOL;
        $plidx++;
      }else{
        $ans = $ans * ($miset[$miidx] % $m) % $m;
 //     echo $ans.PHP_EOL;
        $miidx++;
      }
    }
  }

  if(!$kgu){
    $ans = $ans * $pl[$plidx*2] % $m;
//          echo $ans.PHP_EOL;

  }

  echo $ans % $m;