#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> P;
typedef pair<int,int> Pi;
#define rep(i, n) for (ll i = 0; i < n; i++)
#define FOR(i, a, b) for (ll i = a; i < b; i++)
#define fi first
#define se second
#define PI (acos(-1))

template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}
template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}
template<typename T> ostream& operator<<(ostream& s,const complex<T>& d) {return s<<"("<<d.real()<<", "<<d.imag()<< ")";}
template<typename T1, typename T2> ostream& operator<<(ostream& s,const pair<T1,T2>& d) {return s<<"("<<d.first<<", "<<d.second<<")";}
template<typename T> ostream& operator<<(ostream& s, const vector<T>& d){
	int len=d.size();
	rep(i,len){
		s<<d[i];if(i<len-1) s<<" ";
	}
	return s;
}
template<typename T> ostream& operator<<(ostream& s,const vector<vector<T>>& d){
	int len=d.size();
	rep(i,len){
		s<<d[i]<<endl;
	}
	return s;
}
template<typename T> ostream& operator<<(ostream& s,const set<T>& v){
	s<<"{ ";
	for(auto itr=v.begin();itr!=v.end();++itr) {
		if (itr!=v.begin()) {s<< ", ";}
		s<<(*itr);
	}
	s<<" }";
	return s;
}
template<typename T1, typename T2> ostream& operator<<(ostream& s,const map<T1,T2>& m){
	s<<"{"<<endl;
	for(auto itr=m.begin();itr!=m.end();++itr){
		s<<" "<<(*itr).first<<" : "<<(*itr).second<<endl;
	}
	s<<"}"<<endl;
	return s;
}

const ll mod=1e9+7;
const ll inf=1e18;
const int INF=1e9;

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	ll n,k;
	cin>>n>>k;
	vector<ll> a(n),sei,hu,hu2;
	rep(i,n){
		cin>>a[i];
	}
	sort(begin(a),end(a));
	rep(i,n){
		if(a[i]<0) hu.push_back(a[i]);
		if(a[i]>0) sei.push_back(a[i]);
	}
	sort(begin(sei),end(sei));
	sort(begin(hu),end(hu));
	ll cnt1=hu.size(),cnt3=sei.size(),cnt2=n-cnt1-cnt3;
	vector<ll> num(3);
	num[0]=cnt1*cnt3;//負の数
	num[1]=(cnt1+cnt3)*cnt2+cnt2*(cnt2-1)/2;//0の数
	num[2]=cnt1*(cnt1-1)/2+cnt3*(cnt3-1)/2;//正の数
	//cout<<num<<endl;
	//答えが0になる
	if(num[0]+1<=k && k<=n*(n-1)/2-num[2]){
		cout<<0<<endl;
		return 0;
	}
	if(k<=num[0]){//答えが負の数になる
		auto solve=[&](ll x){//自分以下の数がk個以上になる最小の数を二分探索
			ll cnt=0;
			rep(i,sei.size()){
				ll tar=x/sei[i];
				if(x%sei[i]!=0) tar--;
				cnt+=upper_bound(begin(hu),end(hu),tar)-begin(hu);
			}
			//cout<<x<<' '<<cnt<<endl;
			return cnt>=k;
		};
		ll ok=0,ng=-(inf),mid;
		while(ok-ng>1){
			//cout<<" "<<ok<<' '<<ng<<endl;
			mid=(ok+ng)/2ll;
			//cout<<ok<<endl;
			if(solve(mid)) ok=mid;
			else ng=mid;
		}
		cout<<ok<<endl;
		return 0;
	}
	//答えが正の数になる
	k-=num[0]+num[1];
	rep(i,hu.size()){
		hu2.push_back(-hu[i]);
	}
	sort(begin(hu2),end(hu2));
	auto solve=[&](ll x){
		ll cnt=0;
		rep(i,hu.size()){
			ll tar=x/hu2[i];
			cnt+=upper_bound(begin(hu2)+i+1,end(hu2),tar)-(begin(hu2)+i+1);
		}
		//cout<<x<<' '<<cnt<<endl;
		rep(i,sei.size()){
			ll tar=x/sei[i];
			cnt+=upper_bound(begin(sei)+i+1,end(sei),tar)-(begin(sei)+i+1);
		}
		//cout<<x<<' '<<cnt<<endl;
		//cout<<x<<' '<<cnt<<endl;
		return cnt>=k;
	};
	ll ok=inf,ng=0,mid;
	while(ok-ng>1){
		//cout<<" "<<ok<<' '<<ng<<endl;
		mid=(ok+ng)/2ll;
		//cout<<ok<<endl;
		if(solve(mid)) ok=mid;
		else ng=mid;
	}
	cout<<ok<<endl;
}

Measured memory_bytes: 6256