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 Ruby (2.7.1) (judge verdict: Runtime Error)

def main(str)
  lines = str.split("\n").map { |x| x.split(' ').map(&:to_i) }
  _n, k = lines[0]
  as = lines[1]
  pluses = as.select { |x| x >= 0 }.sort_by { |x| -x }
  minuses = as.select { |x| x < 0 }.map(&:abs).sort_by { |x| -x }
  return -minuses.sort[0...k].inject { |x, m| m = (m * x) % (10 ** 9 + 7)  } if pluses.none?
  ans = 1
  loop do
    ans = ans % (10 ** 9 + 7)
    return ans if k == 0
    return ans * (pluses[0] || minuses[0]) if k == 1
    k -= 2
    return ans * pluses.shift * -minuses.shit  if pluses.count == 1 && minuses.count == 1
    if pluses.count < 2
      2.times { ans *= minuses.shift }
      next
    end
    if minuses.count < 2
      2.times { ans *= pluses.shift }
      next
    end
    
    x = pluses[0] * pluses[1]
    y = minuses[0] * minuses[1]
    if x >= y
      2.times { ans *= pluses.shift }
    else
      2.times { ans *= minuses.shift }
    end
  end
end

unless ENV["TEST"]
  puts(main($stdin.read.chomp) % (10 ** 9 + 7))
  exit(0)
end

require 'minitest/autorun'

class TestA < Minitest::Test
  def test_main
    assert_equal(12, main("4 2
1 2 -3 -4"))
    assert_equal(-6, main("4 3
-1 -2 -3 -4"))
    assert_equal(24, main("4 4
1 -1 -2 -3 -4"))
    assert_equal(24, main("4 5
1 -1 -2 -3 -4"))
    assert_equal(1000000000, main("2 1
-1 1000000000"))
    assert_equal(999983200, main("10 10
1000000000 100000000 10000000 1000000 100000 10000 1000 100 10 1"))
  end
end