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

/*-------------------Define Start-------------------*/
typedef bool BL;    					// 布尔类型
typedef char SB;    					// 有符号1字节,8位
typedef unsigned char UB;    			// 无符号1字节,8位
typedef short SW;    					// 有符号短整型,16位
typedef unsigned short UW;    			// 无符号短整型,16位
typedef long SDW;    					// 有符号整型,32位
typedef unsigned long UDW;   			// 无符号整型,32位
typedef long long SLL;    				// 有符号长整型,64位
typedef unsigned long long ULL;			// 无符号长整型,64位
typedef char CH;    					// 单个字符
typedef float R32;    					// 单精度浮点数
typedef double R64;    					// 双精度浮点数

#define Rep(i, n) for (register SDW i = 0; i < (n); ++i)
#define For(i, s, t) for (register SDW i = (s); i <= (t); ++i)
#define rFor(i, t, s) for (register SDW i = (t); i >= (s); --i)
#define foreach(i, c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
#define ms0(a) memset(a,0,sizeof(a))
#define msI(a) memset(a,0x7f,sizeof(a))
#define LOWBIT(x) ((x)&(-x))

#define MP make_pair
#define PB push_back
#define ft first
#define sd second
#define ALL(x) x.begin(),x.end()

#define pr(x) cout << #x << " = " << x << "  "
#define prln(x) cout << #x << " = " << x << endl

const ULL mod = 1e9 + 7;				//常用模数(可根据题目需要修改)
const ULL inf = 0x7fffffff;				//用来表示无限大
const ULL infLL = 0x7fffffffffffffffLL;	//用来表示无限大
/*-------------------Define End-------------------*/

const UDW maxN = 1e6 + 7;
SDW N, K; 
vector< SLL > posi; // 存正数 
vector< SLL > nega; // 存负数 
SLL zero; // 记录0的个数 
SLL cntP; // 正数数对个数 
SLL cntN; // 负数数对个数 
SLL cntZ; // 零数对个数 
SLL ans;

void input(){
	SLL tmp;
	
	cin >> N >> K;
	Rep(i, N) {
		cin >> tmp;
		if(tmp == 0) {
			++zero;
		}
		else if(tmp > 0) {
			posi.PB(tmp);
		}
		else {
			nega.PB(tmp);
		}
	}
}

SLL upper_bound(vector< SLL > &A, SLL b, SLL p) {
	SLL L = 0;
	SLL R = A.size();
	
	while(L != R) {
		SLL mid = (L + R) >> 1;
		
		if(A[mid] * b <= p) {
			L = mid + 1;
		}
		else {
			R = mid;
		}
	}
	return R;
}

void solve(){
	sort(ALL(posi));
	sort(ALL(nega));
	
	cntP = (SLL)posi.size() * ((SLL)posi.size() - 1) / 2 + (SLL)nega.size() * ((SLL)nega.size() - 1) / 2;
	cntN = (SLL)posi.size() * (SLL)nega.size();
	cntZ = zero * (zero - 1) / 2 + zero * ((SLL)posi.size() + (SLL)nega.size());

	if(K > cntN && K <= cntN + cntZ) {
		ans = 0;
	}
	else if(K <= cntN) { // 第 K 小数对乘积为负数 
		SLL L = posi.back() * nega[0];
		SLL R = posi[0] * nega.back();
		
		while(L != R) {
			SLL mid = (L + R) >> 1;
			SLL sum = 0; // 记录小于等于mid的数对个数 
			
			Rep(i, posi.size()) {
				// 查找 nega 中第一个大于mid / posi[i]的下标 
				SLL tmp = upper_bound(nega, posi[i], mid);
				sum += tmp; 
			} 
			
			if(sum >= K) {
				R = mid;
			}
			else {
				L = mid + 1;
			}
		}
		
		ans = R;
	}
	else { // 第 K 小数对乘积为正数 
		K -= cntN + cntZ;
		for(SDW i = 0; i <= (SDW)nega.size() - i - 1; ++i) {
			swap(nega[i], nega[nega.size() - i - 1]);
		}
		
		if(posi.size() >= 2 && nega.size() >= 2) {
			SLL L = min(posi[0] * posi[1], nega[0] * nega[1]);
			SLL R = max(posi[posi.size() - 1] * posi[posi.size() - 2], nega[nega.size() - 1] * nega[nega.size() - 2]);
			
			while(L != R) {
				SLL mid = (L + R) >> 1;
				SLL sum = 0; // 记录小于等于mid的数对个数 
				
				Rep(i, posi.size()) {
					// 查找 posi 中第一个大于mid / posi[i]的下标 
					SLL tmp = upper_bound(posi, posi[i], mid);
					sum += tmp; 
					if(tmp > i) {
						--sum;
					}
				} 
				
				Rep(i, nega.size()) {
					// 查找 posi 中第一个大于mid / nega[i]的下标 
					SLL tmp = upper_bound(nega, nega[i], mid);
					sum += tmp; 
					if(tmp > i) {
						--sum;
					}
				} 
				
				sum /= 2;
				
				if(sum >= K) {
					R = mid;
				}
				else {
					L = mid + 1;
				}
			}
			
			ans = R;
		}
		// 正数 ×正数
		else if(posi.size() >= 2) {
			
			SLL L = posi[0] * posi[1];
			SLL R = posi[posi.size() - 1] * posi[posi.size() - 2];
			
			while(L != R) {
				SLL mid = (L + R) >> 1;
				SLL sum = 0; // 记录小于等于mid的数对个数 
				
				Rep(i, posi.size()) {
					// 查找 posi 中第一个大于mid / posi[i]的下标 
					SLL tmp = upper_bound(posi, posi[i], mid);
					sum += tmp; 
					if(tmp > i) {
						--sum;
					}
				} 
				
				sum /= 2;
				
				if(sum >= K) {
					R = mid;
				}
				else {
					L = mid + 1;
				}
			}
			
			ans = R;
		}
		
		// 负数 ×负数 
		else if(nega.size() >= 2) {
			SLL L = nega[0] * nega[1];
			SLL R = nega[nega.size() - 1] * nega[nega.size() - 2];
			
			while(L != R) {
				SLL mid = (L + R) >> 1;
				SLL sum = 0; // 记录小于等于mid的数对个数 
				
				Rep(i, nega.size()) {
					// 查找 posi 中第一个大于mid / posi[i]的下标 
					SLL tmp = upper_bound(nega, nega[i], mid);
					sum += tmp; 
					if(tmp > i) {
						--sum;
					}
				} 
				
				sum /= 2;
				
				if(sum >= K) {
					R = mid;
				}
				else {
					L = mid + 1;
				}
			}
			
			ans = R;
		}
	}
}

void output(){
	cout << ans << endl;
}

int main() {
	input();
	solve();
	output();
	return 0;
}


Measured memory_bytes: 2420