#include<bits/stdc++.h>
using namespace std;
//Optimisations
#pragma GCC target ("avx2")
#pragma GCC optimization ("unroll-loops")
#pragma GCC optimize("O2")
//shortcuts for functions
#define pb push_back
#define mp make_pair
#define ff first 
#define ss second
#define all(v) v.begin(),v.end()
#define prec(n) fixed<<setprecision(n)
#define n_l '\n'
// make it python 
#define gcd __gcd
#define append push_back
#define str to_string
// utility functions shortcuts
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define sswap(a,b) {a=a^b;b=a^b;a=a^b;}
#define swap(a,b) {auto temp=a; a=b; b=temp;}
#define init(dp) memset(dp,-1,sizeof(dp));
#define set0(dp) memset(dp,0,sizeof(dp));
#define bits(x) __builtin_popcount(x)
#define SORT(v) sort(all(v))
#define endl "\n"
#define forr(i,n) for(ll i=0;i<n;i++)
// declaration shortcuts
typedef long long int ll;
#define int ll
// Constants
constexpr int dx[] = {-1, 0, 1, 0, 1, 1, -1, -1};
constexpr int dy[] = {0, -1, 0, 1, 1, -1, 1, -1};
constexpr ll INF = 1999999999999999997; 
constexpr int inf= INT_MAX;
constexpr int MAXSIZE = int(1e6)+5;
constexpr auto PI  = 3.14159265358979323846L;
constexpr auto oo  = numeric_limits<int>::max() / 2 - 2;
constexpr auto eps = 1e-6;
constexpr auto mod = 1000000007;
constexpr auto MOD = 1000000007;
constexpr auto MOD9 = 1000000009;
constexpr auto maxn = 100006;
//void IOfile(){
//freopen(file_name, reade_mode, stdin);
//freopen(file_name, write_mode, stdout);
//}
void fastio(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
}

int a[2*maxn];

int n , k;
vector<int>pos;
vector<int>neg;
int lef;
int geta(int mid){
	int cnt = 0;
	for(int i = 0; i < pos.size(); i++){
		int r = i;
		int low = i + 1, high = pos.size()-1;
		while(low <= high){
			int m = (low + high) / 2;
			if(pos[m] * pos[i] <= mid){
				r = m;
				low  = m + 1;
			}else high = m - 1;
		}
		cnt += r - i;
	}
	return cnt;
}
int getb(int mid){
	int cnt = 0;
	for(int i = 0; i < neg.size(); i++){
		int r = i;
		int low = i + 1, high = neg.size()-1;
		while(low <= high){
			int m = (low + high) / 2;
			if(neg[m] * neg[i] <= mid){
				r = m;
				low  = m + 1;
			}else high = m - 1;
		}
		cnt += r - i;
	}
	return cnt;
}

int get(int mid){
	int cnt = 0;
	for(int i = 0; i < pos.size(); i++){
		int r = -1;
		int low = 0, high = neg.size()-1;
		while(low <= high){
			int m = (low + high)/2;
			if(neg[m] * pos[i] <= mid){
				r = m;
				low = m + 1;
			}else high = m - 1;
		}
		cnt += r + 1;
	}
	return cnt;
}

int32_t main(){
	fastio();
	cin >> n >> k;
	forr(i,n){
		cin >> a[i];
		if(a[i] < 0 )neg.push_back(a[i]);
		else pos.push_back(a[i]);
	}
	sort(a,a+n);
	int ans;
	sort(all(neg));
	sort(all(pos));
	int cnt = 0;
	int ind = -1;
	

	int low = - INF, high = 0;
	bool ok = false;
	while(low <= high){
		int mid = (low + high)/2;
		int x = get(mid);
		if(x < k){
			low = mid + 1;
		}else{
			ans = mid;
			ok = true;
			high = mid - 1;
		}
	}

	if(ok){

		cout << ans;
		return 0;
	}
	if(!ok ) lef = k - (neg.size() * pos.size());

	for(int i = 0; i < neg.size(); i++){
		neg[i]*=-1;
	}
	sort(all(neg));
	 low = 0, high = INF;
	while(low <= high){
		int mid = (low + high)/2;
		int x = geta(mid) + getb(mid);
		
		if(x < lef){
			low = mid + 1;
		}
		else if( x >= lef){
			ans = mid;
			high = mid - 1;
		}
		
	}
	cout << ans;
}

Measured memory_bytes: 6696