#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define rep2(i, n) for(int i = 1; i <= (int)(n); i++)
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef int64_t ll;
typedef long double ld;
const ll INF=(1LL<<62);
const double inf=pow(10,10);
const ld pi=acosl(1);
const ll mod = 1000000007;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
const int ddx[8]={1,0,-1,-1,-1,0,1,1};
const int ddy[8]={1,1,1,0,-1,-1,-1,0};

bool check(pair<ll,ll>a,pair<ll,ll>b){
	return (a.first>b.first&&a.second>b.second);
}

bool fun(pair<ll,ll>b,pair<ll,ll>a){
	if(a.first==b.first)return a.second>b.second;
	else return a.first<b.first;
}

int main(){
	ll N,K;cin>>N>>K;
	vector<ll>a;
	vector<ll>b;
	vector<ll>z;
	rep(i,N){
		ll x;cin>>x;
		if(x>0)a.push_back(x);
		if(x<0)b.push_back(x);
		if(x==0)z.push_back(x);
	}
	ll num1=(ll)a.size()*(ll)b.size();
	ll A=a.size();
	ll B=b.size();
	ll num2=A*(A-1)/2+B*(B-1)/2;
	if(K<=num1){
		//K=A*B-K;
		sort(all(a));
		sort(all(b));
		//minus
		ll right=10;
		ll left=-1*1e18;
		while(right-left>1){
			ll mid=left+(right-left)/2;
			ll count=0;
			rep(i,A){
				count+=lower_bound(all(b),(ll)mid/a[i])-b.begin();
			}
			if(count<K)left=mid;
			else right=mid;
		}
		cout<<left<<endl;
		return 0;
	}
	ll num3=N*(N-1)/2-num1-num2;
	if(K<=num1+num3){
		cout<<0<<endl;
		return 0;
	}
	K-=num1+num3;
	rep(i,B)b[i]=abs(b[i]);
	rep(i,A)a[i]=abs(a[i]);
	sort(all(a));
	sort(all(b));
		//minus
		ll right=1e18;
		ll left=-1;
		while(right-left>1){
			ll mid=left+(right-left)/2;
			ll count=0;
			rep(i,A){
				count+=upper_bound(a.begin()+i+1,a.end(),(ll)mid/a[i])-a.begin()-i-1;
			}
			//cout<<count<<endl;
			rep(i,B){
				count+=upper_bound(b.begin()+i+1,b.end(),(ll)mid/b[i])-b.begin()-i-1;
			}
			//cout<<count<<endl;
			//return 0;
			if(count<K)left=mid;
			else right=mid;
		}
		cout<<right<<endl;
		return 0;
}


Measured memory_bytes: 2548