#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;
typedef vector<int> vi;			typedef vector<ll> vl;
typedef vector<vi> vvi; 		typedef vector<vl> vvl;
typedef pair<int, int> 	pii;	typedef pair<ll, ll> pll;
typedef vector<pii> vii; 		typedef vector<pll> vll;
typedef map<int,int> mii;
typedef vector<char> vc;
typedef vector<bool> vb;
#define endl '\n'
#define forn(i,n) for(int i=0;i<n;i++)
#define rforn(i,n) for(int i=n-1;i>=0;i--)
#define forne(i,n) for(int i=1;i<=n;i++)
#define rforne(i,n) for(int i=n;i>=1;i--)
#define forse(i,s,e) for(int i=s;i<e;i++)
#define rforse(i,s,e) for(int i=e-1;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (ll)x.size()
#define MOD 1000000007
#define F first
#define S second
#define pb push_back
#define in insert
#define mp(a, b) make_pair(a, b)
#define fill(a,x) memset(a,x,sizeof a);
#define trav(a,x) for(auto &a:x)
#define min3(a, b, c) min(min(a, b), c)
#define min4(a, b, c, d) min(min(a, b), min(c, d))
#define max3(a, b, c) max(max(a, b), c)
#define max4(a, b, c, d) max(max(a, b), max(c, d))
#define INF INT_MAX
#ifdef KARAN
	#include "../../trace.h"
#else
    #define trace(args...)
#endif

ll modpow(ll a, ll b, ll m = MOD){a %= m; ll res = 1; 
	while (b) {if (b & 1)res = (res * a) % m; a = (a * a) % m; b >>= 1;} return res;}
ll bpow(ll a, ll b){ll res = 1; while (b) {if (b & 1)res = res * a; a = a * a; b >>= 1;} return res;}
ll modinv(ll a, ll m = MOD) {return modpow(a, m - 2, m);}
void graph(vvi &adj, int m) {int x, y; forn(i, m){cin>>x>>y; adj[--x].pb(--y); adj[y].pb(x);}}

void solveneg(vl &pos, vl &neg, ll k){
	k = pos.size()*neg.size()+1-k;
	for(auto &elem: neg) elem = elem * (-1);
	ll lo = 1, hi = 1e18 + 1;
	sort(all(pos)); sort(all(neg));
	while(hi-lo>2){
		ll mid = (lo+hi)/2;
		ll cnt = 0;
		for(auto elem: pos)
			cnt += upper_bound(neg.begin(), neg.end(), mid/elem) - neg.begin();
		if(cnt<k)
			lo = mid + 1;
		else if(cnt==k)
			hi = mid + 1;
		else if(cnt>k)
			hi = mid;
	}

	ll cnt = 0;
	for(auto elem: pos)
		cnt += upper_bound(neg.begin(), neg.end(), lo/elem) - neg.begin();
	if(cnt==k)
		cout<<-1*lo<<endl;
	else
		cout<<-1*(lo+1)<<endl;
}

void solvepos(vl &pos, vl &neg, ll k){
	for(auto &elem: neg) elem = elem * (-1);
	ll lo = 1, hi = 1e18 + 1;
	sort(all(pos)); sort(all(neg));
	while(hi-lo>2){
		ll mid = (lo+hi)/2;
		ll cnt = 0;
		for(ll elem: pos){
			if(elem*elem<=mid) cnt--;
			cnt += upper_bound(pos.begin(), pos.end(), mid/elem) - pos.begin();
		}
		for(ll elem: neg){
			if(elem*elem<=mid) cnt--;
			cnt += upper_bound(neg.begin(), neg.end(), mid/elem) - neg.begin();
		}
		cnt = cnt / 2;
		if(cnt<k)
			lo = mid + 1;
		else if(cnt==k)
			hi = mid + 1;
		else if(cnt>k)
			hi = mid;
	}
	ll cnt = 0;
	for(auto elem: pos){
		if(elem*elem<=lo) cnt--;
		cnt += upper_bound(pos.begin(), pos.end(), lo/elem) - pos.begin();
	}
	for(auto elem: neg){
		if(elem*elem<=lo) cnt--;
		cnt += upper_bound(neg.begin(), neg.end(), lo/elem) - neg.begin();
	}
	cnt = cnt / 2;
	if(cnt==k)
		cout<<lo<<endl;
	else
		cout<<lo+1<<endl;
}

void solve(){
	ll n, k; cin>>n>>k;
	vl a(n); forn(i, n) cin>>a[i];
	vl neg;
	vl pos;
	ll cnt = 0;
	for(auto elem: a) 
		if(elem<0) neg.pb(elem);
		else if(elem>0) pos.pb(elem);
		else cnt++;
	ll cnt_neg = neg.size()*pos.size();
	ll cnt_0 = cnt*(n - cnt) + (cnt*(cnt-1))/2;
	if(k<=cnt_neg)
		solveneg(pos, neg, k);
	else if(k<=cnt_neg+cnt_0)
		cout<<0<<endl;
	else
		solvepos(pos, neg, k-cnt_neg-cnt_0);
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	#ifdef KARAN
		freopen("inp.txt", "r", stdin);
    	freopen("out.txt", "w", stdout);
    	freopen("err.txt", "w", stderr);
	#endif
	int t=1;
	while(t--)
		solve();
}

Measured memory_bytes: 3956