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 Python (3.4.3) (judge verdict: Time Limit Exceeded)

#!/usr/bin python3
# -*- coding: utf-8 -*-

import sys
from heapq import heapify, heappop, heappush, heappushpop

def main():
    N, K = map(int, input().split())
    A = list(map(int,input().split()))
    A.sort()
    M = []
    P = []
    Z = []
    for i in A:
        if i<0:
            M.append(i)
        elif i>0:
            P.append(i)
        else:
            Z.append(i)
    Ml, Zl, Pl = len(M), len(Z), len(P)
    if K <= Ml*Pl:
        #答えがマイナス
        hp = []
        heapify(hp)
        tp = (1, 1)
        heappush(hp, (M[tp[0]-1]*P[-tp[1]],)+tp)
        hist = {tp}
        for k in range(K):
        #最下位をpop
            rec = heappop(hp)
        # 次の順位を登録する
        # Mを次の配列
            tp = (rec[1]+1, rec[2])
            if tp[0]<=Ml and not tp in hist:
                heappush(hp, (M[tp[0]-1]*P[-tp[1]],)+tp)
                hist.add(tp)
        # Pを次の配列
            tp = (rec[1], rec[2]+1)
            if tp[1]<=Pl and not tp in hist:
                heappush(hp, (M[tp[0]-1]*P[-tp[1]],)+tp)
                hist.add(tp)
        print(rec[0])

    elif K<=Ml * Pl + Zl * (N-Zl) + Zl * (Zl-1)//2:
        #答えがzero
        print(0)
    else:
        K -= Ml * Pl + Zl * (N-Zl) + Zl * (Zl-1)//2
        #答えがプラス
        hp = []
        heapify(hp)

        hist = set()
        if Ml>=2:
            tp = (1, 2, 0)
            heappush(hp, (M[-tp[0]]*M[-tp[1]],)+tp)
            hist.add(tp)
        if Pl>=2:
            tp = (1, 2, 1)
            heappush(hp, (P[tp[0]-1]*P[tp[1]-1],)+tp)
            hist.add(tp)
        rec = 0
        for k in range(K-1):
        #最下位をpop
            rec = heappop(hp)
        # 次の順位を登録する
        # Mを次の配列
            if rec[3] == 0: #Mの場合
                tp = (rec[1]+1, rec[2], rec[3])
                if (not tp in hist) and tp[0]<tp[1]:
                    heappush(hp, (M[-tp[0]]*M[-tp[1]],)+tp)
                    hist.add(tp)
                tp = (rec[1], rec[2]+1, rec[3])
                if (not tp in hist) and tp[1]<=Ml:
                    heappush(hp, (M[-tp[0]]*M[-tp[1]],)+tp)
                    hist.add(tp)
        # Pを次の配列
            if rec[3] == 1: #Mの場合
                tp = (rec[1]+1, rec[2], rec[3])
                if (not tp in hist) and tp[0]<tp[1]:
                    heappush(hp, (P[tp[0]-1]*P[tp[1]-1],)+tp)
                    hist.add(tp)
                tp = (rec[1], rec[2]+1, rec[3])
                if (not tp in hist) and tp[1]<=Pl:
                    heappush(hp, (P[tp[0]-1]*P[tp[1]-1],)+tp)
                    hist.add(tp)
        rec = heappop(hp)
        print(rec[0])

if __name__ == '__main__':
    main()