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

readInt() = parse.(Int,split(readline()))
comb2(x) = div((x-1)x,2)

function f(x,neg,pos)
    ret = 0
    n=length(neg); p=length(pos)
    j=1
    for i in 1:n
        while j<=p && neg[i]*pos[j]>x
            j+=1
        end
        
        ret+=p-j+1
    end
    return ret
end

g(x,neg,pos) = h(x,neg)+h(x,pos)

function h(x,a)
    ret = 0
    sz=length(a)
    j=sz
    for i in 1:sz
        while j>i && a[i]*a[j]>x
            j-=1
        end
        j<=i && break
        ret+=j-i
    end
    return ret
end

function answer(K,neg,pos,fc)
    lo=-10^18; hi=10^18
    while hi-lo>1
        c = div(lo+hi,2)
        K <= fc(c,neg,pos) ? (hi=c) : (lo=c)
    end
    println(hi)
end

function solve()
    N,K = readInt()
    A = readInt()
    sort!(A)
    zero=0
    neg=Int[]; pos=Int[]
    for i in 1:N
        if A[i]==0
            zero+=1
            continue
        end
        push!((A[i]<0 ? neg : pos), A[i])
    end
    n=length(neg); p=length(pos)
    α = n*p
    γ = comb2(n)+comb2(p)
    β = comb2(N)-α-γ
    if K<=α
        answer(K,neg,pos,f)
    elseif K<=α+β 
        println(0)
    else
        reverse!(neg); neg*=-1
        answer(K-α-β,neg,pos,g)
    end
end
solve()