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

<?php
//error_reporting(0);
//$N = trim(fgets(STDIN));
list($N,$K) = explode(" ",trim(fgets(STDIN)));
$A = array_map('intval',explode(" ",trim(fgets(STDIN))));
//function chmax(&$a,$b) {if ($a<$b){$a=$b;return true;}return false;}
//function chmix(&$a,$b) {if ($a>$b){$a=$b;return true;}return false;}

//https://atcoder.jp/contests/abc155/submissions/10145564
$N=(int)$N;
$K=(int)$K;

$z=0;
foreach($A as $v) {
  if ($v == 0) {$z++;continue;}
  if ($v > 0) $p[]=$v;
  else $m[]=$v*-1;
}
sort($p);
sort($m);
$pc=count($p);
$mc=count($m);


function cnt($x)
{
  global $p,$m,$z,$N,$K,$pc,$mc;
  if ($x == 0) {
    return $pc * $mc;
  }
  $res = 0;
  if ($x > 0) {
    $res = $pc * $mc;
    $res += $z * ($N - $z);
    $res += $z * intdiv(($z - 1),2);
    $r=0;
    for($i=$pc-1;$i>=0;--$i) {
      while($r < $i && ($p[$r] * $p[$i]) < $x) {
        ++$r;
      }
      $res += min($i,$r);
    }
    $r = 0;
    for($i=$mc-1;$i>=0;--$i) {
      while($r < $i && ($m[$r] * $m[$i]) < $x) {
        ++$r;
      }
      $res += min($i,$r);
    }
  } else {
    $r = $mc - 1;
    for($i=0;$i<$pc;++$i) {
      while($r >= 0 && ($p[$i] * $m[$r]) > ($x*-1)) {
        --$r;
      }
      $res += $mc - $r - 1;
    }
  }
  return $res;
}
$lo = -1000000000000000000;
$hi =  1000000000000000000;
while($lo < $hi) {
  $md = $lo + intdiv((int)($hi - $lo +1),2);
  //printf("md %d cnt(md) %d\n",$md,cnt($md));
  if (cnt($md)>=$K) $hi = $md - 1;
  else $lo = $md;
}
printf("%d\n",$lo);