Buggy python submission (verdict: Time Limit Exceeded):
def bis(K, A, B, t):
    # K 番目に小さい <=> x 未満の数が K 個未満であるような最大の x
    if t==1:
        ok = 0
        ng = 10**18+1
        while ok + 1 < ng:
            c = ok+ng>>1
            cnt = 0
            idx_B = len(B)-1
            for a in A:
                while idx_B >= 0 and a * B[idx_B] >= c:
                    idx_B -= 1
                cnt += idx_B + 1
            if cnt < K:
                ok = c
            else:
                ng = c
    else:
        ok = 0
        ng = 10**18+1
        while ok + 1 < ng:
            c = ok+ng>>1
            cnt = 0
            idx_A = len(A)-1
            idx_B = len(B)-1
            for a in A:
                while idx_A >= 0 and a * A[idx_A] >= c:
                    idx_A -= 1
                cnt += idx_A + 1
                if a*a < c:
                    cnt -= 1
            for b in B:
                while idx_B >= 0 and b * B[idx_B] >= c:
                    idx_B -= 1
                cnt += idx_B + 1
                if b*b < c:
                    cnt -= 1
            cnt >>= 1
            if cnt < K:
                ok = c
            else:
                ng = c
    return ok

def main():
    N, K = map(int, input().split())
    A = sorted(map(int, input().split()))
    cnt_m = cnt_0 = cnt_p = 0
    for a in A:
        if a < 0:
            cnt_m += 1
        elif a == 0:
            cnt_0 += 1
        else:
            cnt_p += 1
    cnt2_m = cnt_m * cnt_p
    cnt2_0 = cnt_0 * N - cnt_0 * (cnt_0 + 1) // 2
    cnt2_p = cnt_p * (cnt_p - 1) // 2 + cnt_m * (cnt_m - 1) // 2
    assert cnt2_m + cnt2_0 + cnt2_p == N * (N - 1) // 2

    if K <= cnt2_m:
        # 絶対値が cnt2_m - K + 1 番目に小さい
        ans = -bis(cnt2_m-K+1, [-a for a in A[::-1] if a<0], [a for a in A if a>0], 1)
    elif K <= cnt2_m + cnt2_0:
        ans = 0
    else:
        ans = bis(K-cnt2_m-cnt2_0, [-a for a in A[::-1] if a<0], [a for a in A if a>0], 2)
    print(ans)

main()


Fixed submission:
def numba_compile(numba_config):
    import os, sys
    if sys.argv[-1] == "ONLINE_JUDGE":
        from numba import njit
        from numba.pycc import CC
        cc = CC("my_module")
        for func, signature in numba_config:
            vars()[func.__name__] = njit(signature)(func)
            cc.export(func.__name__, signature)(func)
        cc.compile()
        exit()
    elif os.name == "posix":
        exec(f"from my_module import {','.join(func.__name__ for func, _ in numba_config)}")
        for func, _ in numba_config:
            globals()[func.__name__] = vars()[func.__name__]
    else:
        from numba import njit
        for func, signature in numba_config:
            globals()[func.__name__] = njit(signature, cache=True)(func)
        print("compiled!", file=sys.stderr)


def bis(K, A, B, t):
    # K 番目に小さい <=> x 未満の数が K 個未満であるような最大の x
    if t==1:
        ok = 0
        ng = 10**18+1
        while ok + 1 < ng:
            c = ok+ng>>1
            cnt = 0
            idx_B = len(B)-1
            for a in A:
                while idx_B >= 0 and a * B[idx_B] >= c:
                    idx_B -= 1
                cnt += idx_B + 1
            if cnt < K:
                ok = c
            else:
                ng = c
    else:
        ok = 0
        ng = 10**18+1
        while ok + 1 < ng:
            c = ok+ng>>1
            cnt = 0
            idx_A = len(A)-1
            idx_B = len(B)-1
            for a in A:
                while idx_A >= 0 and a * A[idx_A] >= c:
                    idx_A -= 1
                cnt += idx_A + 1
                if a*a < c:
                    cnt -= 1
            for b in B:
                while idx_B >= 0 and b * B[idx_B] >= c:
                    idx_B -= 1
                cnt += idx_B + 1
                if b*b < c:
                    cnt -= 1
            cnt >>= 1
            if cnt < K:
                ok = c
            else:
                ng = c
    return ok

numba_compile([
    [bis, "i8(i8,i8[:],i8[:],i8)"],
])

import numpy as np
def main():
    N, K = map(int, input().split())
    A = sorted(map(int, input().split()))
    cnt_m = cnt_0 = cnt_p = 0
    for a in A:
        if a < 0:
            cnt_m += 1
        elif a == 0:
            cnt_0 += 1
        else:
            cnt_p += 1
    cnt2_m = cnt_m * cnt_p
    cnt2_0 = cnt_0 * N - cnt_0 * (cnt_0 + 1) // 2
    cnt2_p = cnt_p * (cnt_p - 1) // 2 + cnt_m * (cnt_m - 1) // 2
    assert cnt2_m + cnt2_0 + cnt2_p == N * (N - 1) // 2

    if K <= cnt2_m:
        # 絶対値が cnt2_m - K + 1 番目に小さい
        X = np.array([-a for a in A[::-1] if a<0], dtype=np.int64)
        Y = np.array([a for a in A if a>0], dtype=np.int64)
        ans = -bis(cnt2_m-K+1, X, Y, 1)
    elif K <= cnt2_m + cnt2_0:
        ans = 0
    else:
        X = np.array([-a for a in A[::-1] if a<0], dtype=np.int64)
        Y = np.array([a for a in A if a>0], dtype=np.int64)
        ans = bis(K-cnt2_m-cnt2_0, X, Y, 2)
    print(ans)

main()