#define _CRT_SECURE_NO_WARNINGS

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll N,K;
vector<int> nA,pA;

ll getRank(ll num) 
{
    ll rnk = 0;
    if(num >= 0) {
        ll cnt = 0;
        if(num==0) {
            cnt = 0;
        } else {
            for(int i=0;i<pA.size();++i) {
                if(pA[i]==0) {
                    cnt += i;
                } else {
                    int left = 0,right = i;
                    while(left<right) {
                        int mid = (left+right)/2;
                        if((ll)pA[mid]*pA[i] >= num) {
                            right = mid;   
                        } else {
                            left = mid + 1;
                        }
                    }
                    //ll t = (num-1)/pA[i];
                    //cnt += upper_bound(pA.begin(), pA.end(), t) - pA.begin();
                    cnt += left;
                    //cerr<<"1-->"<<num<<", "<<pA[left]<<", "<<cnt<<endl;
                }
            }
            //for(int i=0;i<pA.size();++i) if((ll)pA[i]*pA[i]< num) cnt--;
        }
        //rnk += cnt/2;
        rnk += cnt;
        cnt = 0;
        if(num==0) {
            cnt = 0;
        } else {
            for(int i=0;i<nA.size();++i) {
                int left = 0,right = i;
                while(left<right) {
                    int mid = (left+right)/2;
                    if((ll)nA[mid]*nA[i] >= num) {
                        left = mid + 1;
                    } else {
                        right = mid;   
                    }
                }
                //ll t = (num+1)/nA[i];
                //cnt += nA.size() - (upper_bound(nA.begin(), nA.end(), t) - nA.begin());
                cnt += (i-left);
                //cerr<<"2-->"<<num<<", "<<nA[left]<<", "<<cnt<<endl;
            }
            //for(int i=0;i<nA.size();++i) if((ll)nA[i]*nA[i]< num) cnt--;
        }
        //rnk += cnt/2;
        rnk += cnt;
        ll zznum = 0;
        for(int i=0;i<pA.size();++i) if(pA[i]==0) zznum++;
        if(num==0) rnk += ((ll)nA.size()*(ll)(pA.size()-zznum));
        else rnk += ((ll)nA.size()*pA.size());
    }
    else {
        ll cnt = 0;
        for(int i=0;i<pA.size();++i) {
            if(pA[i]==0) {
                cnt += 0;
            } else {
                int left = 0,right = nA.size();
                while(left<right) {
                    int mid = (left+right)/2;
                    if((ll)nA[mid]*pA[i] >= num) {
                        right = mid;   
                    } else {
                        left = mid + 1;
                    }
                }
                //ll t = (num)/pA[i]-1;
                //cnt += upper_bound(nA.begin(), nA.end(), t) - nA.begin();
                cnt += left;
                //cerr<<"3-->"<<num<<", "<<nA[left]<<", "<<cnt<<endl;
            }
        }
        rnk += cnt;
/*        cnt = 0;*/
        //for(int i=0;i<nA.size();++i) {
            //ll t= (num)/nA[i];
            //cnt += pA.size() - (upper_bound(pA.begin(), pA.end(), t) - pA.begin());
            //cerr<<"4-->"<<num<<", "<<t<<", "<<cnt<<endl;
        //}
        /*rnk += cnt;*/
    }
    //cerr<<"rnk: "<<rnk<<endl;
    return rnk;
}

int main()
{
    ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
    cin>>N>>K;
    int tmp;
    for(int i=0;i<N;++i) {
        cin>>tmp;
        if(tmp<0) nA.push_back(tmp);
        else pA.push_back(tmp);
    }
    sort(pA.begin(), pA.end());
    sort(nA.begin(), nA.end());
    ll left =(ll)(-1e18-5), right = (ll)(1e18+5);
    ll ans = 0;
    while(left<=right) {
        ll mid = (left+right)/2;
        if(getRank(mid) >= K) {
            right = mid - 1;
        }
        else {
            left = mid + 1;
            ans = mid;
        }
    }
    cout<<ans<<endl;
    return 0;
}


Measured memory_bytes: 1400