#include <bits/stdc++.h>
using namespace std;
#define INF 1145141919810893364
//INFはすくなくとも10^18+1は必要(10^9の積を扱うので)

long long N,K;
vector<long long> A;
vector<long long> Posi,Nega,Zero;
vector<long long> Nega2;
long long P_posi=0,P_nega=0,P_zero=0;

//Xより少ない数はいくつある？
long long less_than(long long X);


int main(void){
    long long a;
    cin >> N >> K;
    for(int i=0;i<N;i++){
        cin >> a;
        A.push_back(a);
    }
    
    //まず、Aの要素を正、負、０に分ける
    for(int i=0;i<N;i++){
        if(A[i]>0){
            Posi.push_back(A[i]);
        }else if(A[i]<0){
            Nega.push_back(A[i]);
            Nega2.push_back(-A[i]);
        }else{
            Zero.push_back(A[i]);
            //Zeroの要素は0のみなのであえてvectorで持つ必要はないが、あえてこうしておく
        }
    }
    
    
    //二分探索できるよう、ソートしておく
    sort(Posi.begin(),Posi.end());
    sort(Nega.begin(),Nega.end());
    sort(Nega2.begin(),Nega2.end());
    
    //次に、N(N-1)/2個ある積のうち、正であるものの個数を求める
    //負であるもの、０であるものも同様に求める
    
    //積が正になるもの：ともに正かともに負
    //積が負になるもの：正と負の組み合わせ
    //積が０になるもの　どちらかが０
    P_posi += (Posi.size())*(Posi.size()-1)/2;
    P_posi += (Nega.size())*(Nega.size()-1)/2;
    
    P_nega += (Posi.size())*(Nega.size());
    
    P_zero += (Zero.size())*(Zero.size()-1)/2;
    P_zero += (Zero.size())*(Posi.size());
    P_zero += (Zero.size())*(Nega.size());
    
    //にぶたん開始
    long long l=-INF,r=INF,mid;
    while(abs(r-l)>1){
        mid=(l+r)/2;
        //このにぶたんでは、mid未満の数はいくつあるかを数えたい
        //それは、後述する自作関数less_than()でO(NlogN)で計算できる
        long long num = less_than(mid);
        //mid未満の数はnum個である！
        
        //midより小さい数がK個と同じか少なかったらmidが小さすぎる
        if(num<K){
            l=mid;
        }else{
            r=mid;
        }
    }
    cout << l << endl;
    return 0;
}



//Xより少ない数はいくつある？
long long less_than(long long X){
    long long R=0;
    
    if(X<0){
        //Xより小さい数はいくつ？？
        //Xより小さい数は、絶対値がXのものより大きい
        //なのでにぶたんでは、絶対値がXより真に大きいものの数を数える必要がある
        //直接この処理を走らせることは困難
        //なので、「絶対値がXのものと同じか小さいもの」の数を数え、それを総数から引くことで数える
        long long num=0;
        for(int i=0;i<Nega.size();i++){
            auto it=std::upper_bound(Posi.begin(), Posi.end(), X/Nega[i]);
            num+=it-Posi.begin();
        }
        num=P_nega-num;
        R=num;
        
        
        
    }else if(X==0){
        //0より小さい数は、P_nega個
        R=P_nega;
        
        
        
    }else{
        //負の数をそのままにぶたんをするとこわれやすい(実装と頭が)
        //なので負の要素を全て正にしておいたもの(Nega2)を用意してそれでにぶたんをした
        
        //Xより小さい数はいくつ？？
        //まず０と負の数は明らかにXより小さい
        R=P_nega+P_zero;
        //基本的には負の場合と同様の処理をする
        //しかし、正の場合はPosi*Posi,Nega*Negaなので重複をケアする必要がある
        //以下のように処理することでケアができる(図解すると理解が早い)
        //また総数から引くことなく、Xより小さい数を直接求められる
        long long num=0;
        for(int i=0;i<Posi.size();i++){
            auto it = std::upper_bound(Posi.begin(), Posi.end(), (X-1)/Posi[i]);
            long long temp=(it-Posi.begin());
            num+=min(temp,(long long)i);
        }
        for(int i=0;i<Nega2.size();i++){
            auto it = std::upper_bound(Nega2.begin(), Nega2.end(), (X-1)/Nega2[i]);
            long long temp=(it-Nega2.begin());
            num+=min(temp,(long long)i);
        }
        R+=num;
    }
    
    return R;
}


Measured memory_bytes: 6512