#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define mod 1000000007
#define lim 1000000000000000007
#define lim1 18446744073709551615  //Unsigned
#define sq(a) ((a)*(a))
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define mms(v,i) memset(v,i,sizeof(v))
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define REP(i,a,b) for (int i = a; i <= b; i++)
#define REPN(i,a,b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef pair<int,int> pi;
typedef pair<ll,ll> PL;
typedef pair<ll,int> PLI;
typedef pair<int,ll> PIL;
typedef pair<int,pair<int,int> > pii;
typedef pair<double,double> pdd;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
ll power(ll a,ll b) {
    if (b==0) return 1;
    ll c = power(a,b>>1);
    c = (c*c)%mod;
    if (b&1) return (c*a)%mod;
    return c;
}
ll powerwithoutmod(ll a,ll b) {
    if (b==0) return 1;
    ll c = power(a,b>>1);
    c = (c*c);
    if (b&1) return (c*a);
    return c;
}
ll gcdll(ll a,ll b) {
    if (b==0) return a;
    return gcdll(b,a%b);
}
int gcd(int a,int b) {
    if (b==0) return a;
    return gcd(b,a%b);
}

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

const int N = (int)1e5+5;
const int Q = 301;
const int logN = 16;

ll cnt_pairs(vector<int>& v, int n, ll a) {
    if (!a) return 0;
    ll ret = 0;
    REP(i,0,n-1) {
        int lo = i, hi = n-1, mi;
        while (lo<hi) {
            mi = 1+(lo+hi)/2;
            if ((ll)v[i]*v[mi]<a) {
                lo = mi;
            }
            else hi = mi-1;
        }
        ret += (lo-i);
    }
    return ret;
}
ll cnt(vector<int>& pos, vector<int>& neg, int z, int n, ll a) {
    ll ret = 0;
    if (a>=0) {
        int p = pos.size();
        int ng = neg.size();
        ret += (ll)p*ng;
        if (a>0) {
            ret += ((ll)z*(n-z) + ((ll)z*(z-1))/2);
        }
        ret += cnt_pairs(pos, p, a);
        ret += cnt_pairs(neg, ng, a);
    }
    else {
        a *= -1;
        int p = pos.size();
        int ng = neg.size();
        int lo = ng;
        REP(i,0,p-1) {
            while (lo>0 && (ll)pos[i]*neg[lo-1]>a) {
                lo--;
            }
            ret += (ng-lo);
        }
    }
    return ret;
}
void solve() {
	int n,v;
	ll k;
	cin>>n>>k;
	int z = 0;
	vector<int> pos, neg;
	REP(i,0,n-1) {
        cin>>v;
        if (v!=0) {
            if (v>0) pos.pb(v);
            else neg.pb(-v);
        }
        else z++;
	}
	sort(all(pos));
	sort(all(neg));
	ll lo = -lim, hi = lim, mi;
	while (lo<hi) {
        mi = lo + (hi-lo+1)/2;
        if (cnt(pos,neg,z,n,mi)>=k) hi = mi-1;
        else lo = mi;
	}
	cout<<lo;
}
int main() {
    //freopen("output.txt","r",stdin);
    //freopen("output.txt","w",stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int T=1;
    //cin>>T;
    REP(TC,1,T) {
        //cout<<"Case #"<<TC<<": ";
        solve();
        //cout<<"\n";
    }
}


Measured memory_bytes: 1400