Problem:
Score: 400 points

Problem Statement

We have N integers A_1, A_2, ..., A_N.

There are \frac{N(N-1)}{2} ways to choose two of them and form a pair. If we compute the product of each of those pairs and sort the results in ascending order, what will be the K-th number in that list?

Constraints

All values in input are integers.

2 \leq N \leq 2 \times 10^5

1 \leq K \leq \frac{N(N-1)}{2}

-10^9 \leq A_i \leq 10^9\ (1 \leq i \leq N)

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \dots A_N

Output

Print the answer.

Sample Input 1

4 3
3 3 -4 -2

Sample Output 1

-6

There are six ways to form a pair. The products of those pairs are 9, -12, -6, -12, -6, 8.

Sorting those numbers in ascending order, we have -12, -12, -6, -6, 8, 9. The third number in this list is -6.

Sample Input 2

10 40
5 4 3 2 -1 0 0 0 0 0

Sample Output 2

6

Sample Input 3

30 413
-170202098 -268409015 537203564 983211703 21608710 -443999067 -937727165 -97596546 -372334013 398994917 -972141167 798607104 -949068442 -959948616 37909651 0 886627544 -20098238 0 -948955241 0 -214720580 277222296 -18897162 834475626 0 -425610555 110117526 663621752 0

Sample Output 3

448283280358331064

Solution in PHP7 (7.0.15) (judge verdict: Accepted)

<?php
list($N, $K) = ints();
$A = ints();
$mi = $pl = [];
$zero = 0;
foreach($A as $a){
  if($a < 0){
    $mi[] = $a;
  }elseif($a > 0){
    $pl[] = $a;
  }else{
    $zero++;
  }
}
$minusCount = count($mi)*count($pl);
$zeroCount = $zero*(count($pl)+count($mi)) + intdiv($zero*($zero-1), 2);
rsort($mi);
sort($pl);
$micount = count($mi);
$plcount = count($pl);

$min = (int)-10**18;
$max = (int)10**18;
while($max>$min){
  $mid = $min + intdiv($max-$min+1,2);
  if(countLT($mid)>=$K){
    $max = $mid-1;
  }else{
    $min = $mid;
  }
}
echo $min;

function countLT($t){
  global $mi, $pl, $zero, $minusCount, $zeroCount, $micount,$plcount;
  if($t==0){
    return $minusCount;
  }elseif($t > 0){
    $count = $minusCount + $zeroCount;
    //pl*pl
    $i = $plcount-1;
    foreach($pl as $j => $p){
      while(($pl[$i]??0) * $p >= $t)--$i;
      if($i > $j)$count+=$i-$j;
    }
    //mi*mi
    $i = $micount-1;
    foreach($mi as $j => $m){
      while(($mi[$i]??0) * $m >= $t)--$i;
      if($i > $j)$count+=$i-$j;
    }
  }else{
    $count = ($micount-1) * $plcount;
    $i = $micount-1;
    foreach($pl as $p){
      while(($mi[$i]??0) * $p < $t)$i--;
      $count-=$i;
    }
  }
  return $count;
}

function ints(){
  return array_map("intval", explode(" ", trim(fgets(STDIN))));
}