#include "bits/stdc++.h"
using namespace std;
///////////////////////////////////////////
const long long int INF = 1LL<<60;
const long long int Mod = 1000000007;
using ll = long long int; using ci = const int;
using vi = vector<int>;  using Vi = vector<long long int>;
using P = pair<int, int>;  using PLL = pair<ll, ll>;
using matrix = vector<vector<ll>>;
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define all(x) (x).begin(),(x).end()
#define rep(i,N) for(ll i = 0; i < (ll)N; i++)
#define repi(i,a,b) for(ll i = ll(a); i < ll(b); ++i)
template<class T>bool chmax(T &former, const T &b) { if (former<b) { former=b; return true; } return false; }
template<class T>bool chmin(T &former, const T &b) { if (b<former) { former=b; return true; } return false; }
template<class T>T sqar(T x){ return x*x; }//sqrt(x)は平方根;
#define Sort(v) std::sort(v.begin(), v.end(), std::greater<decltype(v[0])>()) //降順でVをソート
#define p_queue(v) priority_queue<v, vector<v>, greater<v> >
template<class T> inline void princ(T x){cout<<x<<" ";}; 
template<class T> inline void print(T x){cout<<x<<"\n";};
template<class T> inline void Yes(T condition){ if(condition) cout << "Yes" << endl; else cout << "No" << endl; }
template<class T> inline void YES(T condition){ if(condition) cout << "YES" << endl; else cout << "NO" << endl; }
///////////////////////////////////////////////////////////////////////////////////

ll n,k;
Vi a;
Vi pl,mi,ze;
bool ck1(ll n){//n以下はk個以上あるか?
    ll tmp = 0;
    ll sum = 0;
    //n = abs(n);
    rep(i,mi.size()){
        if(abs(n)%abs(mi[i])==0)tmp = upper_bound(all(pl),n/mi[i]-1)-pl.begin();
        else tmp = upper_bound(all(pl),n/mi[i])-pl.begin();
        //if(tmp>=i)tmp--;
        //tmp--;
        sum += pl.size()-tmp;

    }
    if(sum>=k)return true;
    else return false;
}

bool ck2(ll n){
    ll tmp = 0;
    ll sum = 0;
    rep(i,mi.size()){
        if(n%mi[i]==0)tmp = upper_bound(all(mi),n/mi[i])-mi.begin();
        else tmp = upper_bound(all(mi),n/mi[i])-mi.begin();
        //tmp--;
        if(i<tmp)tmp--;
        sum+=tmp;
    }
    rep(i,pl.size()){
        if(n%pl[i]==0)tmp = upper_bound(all(pl),n/pl[i])-pl.begin();
        else tmp = upper_bound(all(pl),n/pl[i])-pl.begin();
        //tmp--;
        if(i<tmp)tmp--;
        sum += tmp;
    }
    sum/=2;
    if(sum>=k)return true;
    else return false;
}


int main(){
    cin.tie(0);ios::sync_with_stdio(false);
    std::cout<<std::fixed<<std::setprecision(30);
    cin>>n>>k;
    a.resize(n);
    rep(i,n){
        cin>>a[i];
    }
    sort(all(a));
    rep(i,n){
        if(a[i]<0){
            mi.pb(a[i]);
        }else if(a[i]==0){
            ze.pb(a[i]);
        }else{
            pl.pb(a[i]);
        }
    }
    int typ = -1;
    ll tmp = 0;
    if(mi.size()*pl.size()<k){
        tmp+= mi.size()*pl.size();
    }else{
        typ = 1;
    }
    if(typ==-1){
        if(ze.size()*(ze.size()-1)/2 + tmp +ze.size()*(pl.size()+mi.size()) < k){
            tmp += ze.size()*(ze.size()-1)/2 + ze.size()*(pl.size()+mi.size());
        }else{
            typ = 0;
        }
    }
    k -= tmp;
    if(typ==0){
        print(0);
    }else if(typ==1){//<0
        sort(all(mi));
        sort(all(pl));
        ll mid, ok = 0, ng = -INT64_MAX;
        while(abs(ok-ng)>1){
            mid = (ok+ng)/2;
            if(ck1(mid))ok = mid;
            else ng = mid;
        }//midではなくokを使わないとバグる!
        print(ok);
    }else{
        rep(i,mi.size()){
            mi[i] = -mi[i];
        }
        sort(all(mi));
        sort(all(pl));
        ll mid, ok = INT64_MAX, ng = 0;
        while(abs(ok-ng)>1){
            mid = (ok+ng)/2;
            if(ck2(mid))ok = mid;
            else ng = mid;
        }//midではなくokを使わないとバグる!
        print(ok);
    }
    //print(ck2(1));
    return 0;
}

Measured memory_bytes: 4468