Buggy python submission (verdict: Time Limit Exceeded):
N,K=map(int,input().split())
A=[int(i) for i in input().split()]
Aminus=[]
Aplus=[]
negative=0
positive=0
posinega=0
for i in range(N):
    if A[i]>0:
        positive+=1
        Aplus.append(A[i])
    elif A[i]<0:
        negative+=1
        Aminus.append(A[i])
    else:
        posinega+=1
Aplus.sort()
Aminus.sort()
PLUS=positive*positive+negative*negative
MINUS=2*positive*negative
ZERO=N*N-PLUS-MINUS

PLUS=(PLUS-(N-posinega))//2
MINUS=MINUS//2
ZERO=(ZERO-posinega)//2
if K<=MINUS:
    #ans<0
    low=-10**30
    high=0
    while(high-low>1):
        mid=(high+low)//2
        '''
        A[i]*A[j]<lowとなる(i<j)の組み合わせはK個未満である
        A[i]*A[j]<highとなる(i<j)の組み合わせはK個以上である
        tmpはA[i]*A[j]<midとなる(i<j)の組み合わせである
        '''
        tmp=0
        for i in range(positive):
            low0=-1
            high0=negative
            while(high0-low0>1):
                mid0=(high0+low0)//2
                '''
                Aplus[i]*Aminus[j]はjについて単調増加である。
                Aplus[i]*Aminus[low0]<mid<=Aplus[i]*Aminus[high0]を常に満たす必要がある
                '''
                if Aplus[i]*Aminus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
        if tmp<K:
            low=mid
        else:
            high=mid
    print(low)
elif K<=MINUS+ZERO:
    print(0)
else:
    K-=MINUS+ZERO
    #ans>0
    low=0
    high=10**30
    Aminus=Aminus[::-1]
    while(high-low>1):
        mid=(high+low)//2
        '''
        A[i]*A[j]<lowとなる(i<j)の組み合わせはK個未満である
        A[i]*A[j]<highとなる(i<j)の組み合わせはK個以上である
        tmpはA[i]*A[j]<midとなる(i<j)の組み合わせである
        '''
        tmp=0
        for i in range(positive):
            low0=-1
            high0=positive
            while(high0-low0>1):
                mid0=(high0+low0)//2
                '''
                Aplus[i]*Aplus[j]はjについて単調増加である。
                Aplus[i]*Aplus[low0]<mid<=Aplus[i]*Aplus[high0]を常に満たす必要がある
                '''
                if Aplus[i]*Aplus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
            if Aplus[i]*Aplus[i]<mid:
                tmp-=1
        for i in range(negative):
            low0=-1
            high0=negative
            while(high0-low0>1):
                mid0=(high0+low0)//2
                if Aminus[i]*Aminus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
            if Aminus[i]*Aminus[i]<mid:
                tmp-=1
        tmp=tmp//2
        if tmp<K:
            low=mid
        else:
            high=mid
    print(low)


Fixed submission:
N,K=map(int,input().split())
A=list(map(int,input().split()))
Aminus=[]
Aplus=[]
negative=0
positive=0
posinega=0
for i in range(N):
    if A[i]>0:
        positive+=1
        Aplus.append(A[i])
    elif A[i]<0:
        negative+=1
        Aminus.append(A[i])
    else:
        posinega+=1
Aplus.sort()
Aminus.sort()
PLUS=positive*positive+negative*negative
MINUS=2*positive*negative
ZERO=N*N-PLUS-MINUS

PLUS=(PLUS-(N-posinega))//2
MINUS=MINUS//2
ZERO=(ZERO-posinega)//2
if K<=MINUS:
    #ans<0
    low=min(A)*max(A)
    high=0
    while(high-low>1):
        mid=(high+low)//2
        '''
        A[i]*A[j]<lowとなる(i<j)の組み合わせはK個未満である
        A[i]*A[j]<highとなる(i<j)の組み合わせはK個以上である
        tmpはA[i]*A[j]<midとなる(i<j)の組み合わせである
        '''
        tmp=0
        for i in range(positive):
            low0=-1
            high0=negative
            while(high0-low0>1):
                mid0=(high0+low0)//2
                '''
                Aplus[i]*Aminus[j]はjについて単調増加である。
                Aplus[i]*Aminus[low0]<mid<=Aplus[i]*Aminus[high0]を常に満たす必要がある
                '''
                if Aplus[i]*Aminus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
        if tmp<K:
            low=mid
        else:
            high=mid
    print(low)
elif K<=MINUS+ZERO:
    print(0)
else:
    K-=MINUS+ZERO
    #ans>0
    low=0
    high=max(min(A)**2,max(A)**2)
    Aminus=Aminus[::-1]
    while(high-low>1):
        mid=(high+low)//2
        '''
        A[i]*A[j]<lowとなる(i<j)の組み合わせはK個未満である
        A[i]*A[j]<highとなる(i<j)の組み合わせはK個以上である
        tmpはA[i]*A[j]<midとなる(i<j)の組み合わせである
        '''
        tmp=0
        for i in range(positive):
            low0=-1
            high0=positive
            while(high0-low0>1):
                mid0=(high0+low0)//2
                '''
                Aplus[i]*Aplus[j]はjについて単調増加である。
                Aplus[i]*Aplus[low0]<mid<=Aplus[i]*Aplus[high0]を常に満たす必要がある
                '''
                if Aplus[i]*Aplus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
            if Aplus[i]*Aplus[i]<mid:
                tmp-=1
        for i in range(negative):
            low0=-1
            high0=negative
            while(high0-low0>1):
                mid0=(high0+low0)//2
                if Aminus[i]*Aminus[mid0]<mid:
                    low0=mid0
                else:
                    high0=mid0
            tmp+=high0
            if Aminus[i]*Aminus[i]<mid:
                tmp-=1
        tmp=tmp//2
        if tmp<K:
            low=mid
        else:
            high=mid
    print(low)