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 Fortran (gfortran v4.8.4) (judge verdict: Accepted)

program pairs
  implicit none
  integer :: n, i
  integer(8) :: k, l = -1e18, r = 1e18, m, c
  integer(8), dimension(200000) :: a = 0, b = 0
  read(*,*) n, k
  read(*,*) a(1:n)
  call quick_sort(a(1:n))
  do while (r-l > 1)
    m = (l+r)/2
    c = 0
    do i = 1, n
      if (a(i) < 0) then
        c = c+count_lower(a(n:i+1:-1),a(i),m)
      else
        c = c+count_lower(a(i+1:n),a(i),m)
      end if
    end do
    if (c < k) then
      l = m
    else
      r = m
    end if
  end do
  write(*,'(i0)') l
contains
  function count_lower(a,b,c) result(r)
    integer(8), intent(in) :: a(:), b, c
    integer :: l, r, m
    l = 0
    r = size(a)+1
    do while (r-l > 1)
      m = (l+r)/2
      if (a(m)*b < c) then
        l = m
      else
        r = m
      end if
    end do
    r = r-1
  end
  recursive subroutine quick_sort(a)
    integer(8), intent(inout) :: a(:)
    integer :: n, l, r, m
    integer(8) :: p
    n = size(a,1)
    l = 1
    r = n
    m = (n+1)/2
    p = a(l)+a(m)+a(r)-max(a(l),a(m),a(r))-min(a(l),a(m),a(r))
    do
      do while (a(l) < p)
        l = l+1
      end do
      do while (a(r) > p)
        r = r-1
      end do
      if (l >= r) exit
      a(l) = xor(a(l),a(r))
      a(r) = xor(a(l),a(r))
      a(l) = xor(a(l),a(r))
      l = l+1
      r = r-1
    end do
    if (l-1 > 1) call quick_sort(a(1:l-1))
    if (n > r+1) call quick_sort(a(r+1:n))
  end
end program pairs