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

n, k = gets.split.map(&:to_i)
a    = Array.new(n){ gets.to_i).sort

l = -10 ** 18
r =  10 ** 18

nega_sta = 0
zero_sta = nega_end = a.bsearch_index{|t| t >=  0} || n
posi_sta = zero_end = a.bsearch_index{|t| t > 0} || n
posi_end = n
# p a
# p [nega_end, nega_sta]
# p [posi_sta]
nn = nega_end - nega_sta
nz = zero_end - zero_sta
np = posi_end - posi_sta

nnp = nn * np # numuber of negative pairs
nzp = nz * (np + nn ) + nz * (nz - 1 ) / 2
 
if nnp < k && k <= nnp + nzp
  puts 0
  exit
end
# nega = a[nega_sta,nn]
# posi = a[posi_sta,np]
# p [nn,nz,np,nega,posi]
if k <= nnp
  
  ok =   0
  ng = -10 ** 18
  while ( ok - ng ).abs > 1
    x = ( ok + ng ) / 2
    cnt = 0
    r   = posi_sta
    nega_end.times do |l|
      while (r < n) && a[l] * a[r] > x
        r += 1
      end
      cnt += np - ( r - posi_sta )
    end
    if cnt >= k
      ok = x
    else
      ng = x
    end
  end
  puts ok
  
elsif k <= nnp + nzp
  puts 0

else
  
  k -= nnp + nzp
  ok = 10 ** 18
  ng = 0
  while ( ok - ng ).abs > 1
    x = ( ok + ng ) / 2
    cnt = 0
    
    r = n - 1
    (posi_sta...n).each do |l|
      while r < n && a[l] * a[r] > x && l < r
        r -= 1
      end
      cnt += (r - l) if r - l > 0
    end
    
    l = 0
    (nega_end-1).downto(0) do |r|
      while l < n && a[l] * a[r] > x && l < r
        l += 1
      end
      cnt += r - l if r - l > 0
    end
    # puts x
    if cnt >= k
      ok = x
    else
      ng = x
    end
  end
      
  puts ok
end