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 Julia (0.5.0) (judge verdict: Accepted)

parseInt(x) = parse(Int, x)
parseMap(x::Array{SubString{String},1}) = map(parseInt, x)
function bsearch(a,x);l,r=0,length(a)+1;while r-l>1;m=(r+l)>>1;if a[m]<x;l=m;else;r=m;end;end;l;end
cldd(x,y)=y==0?10^18:fld(x,y)+1


function main()
	n,k = readline() |> split |> parseMap
	a = readline() |> split |> parseMap |> sort
	nc = bsearch(a,0)
	b = Int[]
	for i in 1:nc
		push!(b,a[i])
	end
	c = Int[]
	for i in nc+1:n
		push!(c,a[i])
	end
	if nc*(n-nc)>=k
		l = b[1]*c[n-nc]-1
		r = 1
		while r-l>1
			m = (l+r)>>1
			s = 0
			for i in 1:nc
				s += n-nc-bsearch(c,cld(-m,-b[i]))
			end
			if s>=k
				r = m
			else
				l = m
			end
		end
		println(r)
	else		
		l = -1
		r = max(a[n]*a[n-1],a[1]*a[2])+1
		b = sort(Int[-b[i] for i in 1:nc])
		while r-l>1
			m = (l+r)>>1
			s = 0
			for i in 1:nc
				t = bsearch(b,cldd(m,b[i]))
				s += min(t,i-1)
			end
			for i in 1:n-nc
				t = bsearch(c,cldd(m,c[i]))
				s += min(t,i-1)
			end
			if s+nc*(n-nc)>=k
				r = m
			else
				l = m
			end
		end
		println(r)
	end
end

main()