#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<vector>
#include<algorithm>

using namespace std;

#define int long long
#define endl "\n"

constexpr long long INF = (long long)1e18;
constexpr long long MOD = 1'000'000'007; 

string yn(bool f){return f?"Yes":"No";}
string YN(bool f){return f?"YES":"NO";}

#define f first
#define s second

int N, K;
vector<pair<int,int>> A;
int minimum = INF, maximum = -INF;

int check(int num){
	int con = 0;
	
	// if(num > maximum*maximum) return N*N;
	
	// cout<<"=++++++++++++++++++++++++++++++++++   "<<num<<endl;
	for(int i = 0; i < N; i++){
		// cout<<"<> "<<i<<" A "<<A[i].f<<" con "<<con<<endl;
		// if(A[i].f == 0) {
			// if(num >= 0) con += max(i-1,0ll);
		// }else if(A[i].f >= 0 && num >= 0){
			// pair<int,int> x = {num / A[i].f, INF};
			// int temp, temp2;
			
			
			// temp = upper_bound(A.begin(), A.end(), x) - A.begin();
			
			// cout<<temp<<" [+] "<<i<<" x "<<x.f<<endl;
			// con += max(0ll,min(temp, i-1));
		// } else if(A[i].f < 0 && num < 0){
			// pair<int,int> x = {-((long long)abs(num) + abs(A[i].f) - 1)/ abs(A[i].f), INF};
			// int temp, temp2;
			
			// temp = upper_bound(A.begin(), A.end(), x) - A.begin();
			
			// cout<<temp<<" (-) "<<i<<" x "<<x.f<<endl;
			// con += max(0ll,min(temp, i-1));
		// } 
		if(A[i].f == 0) {
			// cout<<"000 "<<endl;
			if(num >= 0) { 
				// con += max(0ll,min(temp, i));
				con += max(i,0ll);
				// cout<<max(i,0ll)<<endl;
			} else {
				// cout<<0<<endl;
			}
		}else if(A[i].f >= 0 && num >= 0){
			pair<int,int> x = {num / A[i].f, INF};
			int temp, temp2;
			
			
			temp = upper_bound(A.begin(), A.end(), x) - A.begin();
			
			// cout<<temp<<" [+0] "<<i<<" x "<<x.f<<" "<<min(temp, i)<<endl;
			
			con += max(0ll,min(temp, i));
			// con += min(temp, i);
		} else if(A[i].f < 0 && num >= 0){
			pair<int,int> x = {-((long long)abs(num) + abs(A[i].f-1)-1)/ abs(A[i].f), INF};
			// pair<int,int> x = {-((long long)abs(num) + abs(A[i].f)-1)/ abs(A[i].f), -INF};
			// pair<int,int> x = {(num)/ A[i].f, INF};
			int temp, temp2;
			
			temp = i - (upper_bound(A.begin(), A.end(), x) - A.begin());
			// temp = i - (lower_bound(A.begin(), A.end(), x) - A.begin());
			
			// cout<<temp<<" (-1) "<<i<<" x "<<x.f<<" "<<min(temp, i)<<endl;
			con += max(0ll,min(temp, i));
			// con += min(temp, i);
		} else if(A[i].f > 0 && num < 0){
			pair<int,int> x = {-((long long)abs(num) + abs(A[i].f) - 1)/ abs(A[i].f), INF};
			int temp, temp2;
			
			temp = upper_bound(A.begin(), A.end(), x) - A.begin();
			
			// cout<<temp<<" (-2) "<<i<<" x "<<x.f<<" "<<min(temp, i)<<endl;
			con += max(0ll,min(temp, i));
			// con += min(temp, i);
		}
		
		int zz = 0;
		for(int j = 0; j < i ; j++){
			if(num >= A[i].f * A[j].f) zz++;
		}
		
		// cout<<"TTTTTT "<<zz<<endl;
	}
	
	return con;
}

int check2(int num){
	int con = 0;
	
	for(int i = 0; i < N; i++){
		for(int j = 0; j < i ; j++){
			if(num >= A[i].f * A[j].f) con++;
		}
	}
	
	return con;
}

signed main(){
	// cin.tie(nullptr);
	// ios::sync_with_stdio(false);
	// cout<<fixed<<setprecision(10);
	
	
	cin>>N>>K;
	
	A.resize(N);
	
	for(int i = 0; i < N; i++){
		cin>>A[i].f;
		minimum = min(A[i].f, minimum);
		maximum = max(A[i].f, maximum);
	}
	
	sort(A.begin(), A.end());
	
	for(int i = 1; i < N; i++){
		if(A[i-1].f == A[i].f) A[i].s = A[i-1].s+1;
	}
	
	// for(int i = -12; i <= 10; i++){
		// cout<<"i = "<<i<<" "<<check(i)<<" "<<check2(i)<<endl;
	// }
	
	// int l = (long long)-abs(minimum) *  (long long)abs(minimum), h = (long long)abs(maximum)*(long long)abs(maximum)+10, m;
	// int l = (long long)-abs(minimum) *  (long long)abs(minimum), h = (long long)abs(maximum)*(long long)abs(maximum)+10, m;
	int l = -INF, h = INF, m;
	while(l+1<h){
		m = (l+h)/2;
		int temp = check(m);
		// cout<<"l = "<<l<<" h = "<<h<<endl;
		
		// cout<<"m "<<m<<" "<<temp<<endl;
		// string hogehoge;
		// cin>>hogehoge;

		if (temp < K) {
			l = m;
		} else {
			h = m;
		}
	}
	
	
	// cout<<l<<" "<<h<<endl;
	cout<<h<<endl;
	
	return 0;
}

Measured memory_bytes: 3328