//Dragon_warrior7(IITK)
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long
#define pb push_back
#define nl cout << '\n'
#define sor(x) sort(x.begin(), x.end())
#define rev(v) reverse(v.begin(), v.end())
#define lb(v, temp) lower_bound(v.begin(), v.end(), temp)
#define ub(v, temp) upper_bound(v.begin(), v.end(), temp)
#define fi first
#define se second
#define llmax 1000000000000000000
#define pll pair<ll, ll> 
#define vll vector<ll> 
#define rub cout << "\n------------------------------------\n"
#define deb(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }

void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) 
{
	cout << *it << " = " << a;
	nl;
	err(++it, args...);
}
typedef  tree < int ,  null_type ,  greater<int> ,  rb_tree_tag ,  tree_order_statistics_node_update > oset;
void read(vector<ll> &v)
{
	for (int i = 0; i < v.size(); i++)
		cin >> v[i];
}
const int mod=1e9+7;
ll power(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll modInverse(ll a){return power(a,mod-2);}
ll binpow(ll a, ll b, ll m) 
{a %= m;b%=(m-1);ll res = 1;while (b > 0) {if (b & 1)res = res * a % m;a = a * a % m;b >>= 1; }return res;}
void print(vector<ll> v)
{
	for (int i = 0; i < v.size(); i++)
		cout << v[i] << " ";
}
ll n,m,a,b,c,temp,x,y;
string str;
vll neg;
vll pos;
vll absneg;
ll check(ll val)
{
   ll sum=0;
   val=abs(val);
   for(auto x:neg)
   {
       temp=-x;
       if(val%temp==0)
       {
        sum+=pos.end()-lb(pos,val/temp);  
       }
       else
       {
           sum+=pos.end()-ub(pos,val/temp);
       }
   }
   return sum;
}
ll check1(ll val)
{
    ll sum=0;
    for(int i=0;i<pos.size();i++)
    {
        temp=pos[i];
        sum+=upper_bound(pos.begin()+i+1,pos.end(),val/temp)-(pos.begin()+i+1);
    }
     for(int i=0;i<absneg.size();i++)
    {
        temp=absneg[i];
        sum+=upper_bound(absneg.begin()+i+1,absneg.end(),val/temp)-(absneg.begin()+i+1);
    }
    return sum;
}
void solveforthiscase(const int & test)
{//deb(test);
cin>>n;
ll k;
cin>>k;
vll v(n);
read(v);
ll negative=0,positive=0,zero=0;
for(int i=0;i<n;i++)
{
    if(v[i]<0)
    {
        negative++;
        neg.pb(v[i]);
    }
    else if(v[i]==0)
    zero++;
    else
    {
        positive++;
        pos.pb(v[i]);
    }
}
sor(neg);
sor(pos);
absneg=neg;
for(int i=0;i<absneg.size();i++)
{
    absneg[i]=-absneg[i];
}
sor(absneg);
ll total=n*(n-1);
total/=2;
ll np=negative*positive;
ll zp=(zero*(zero-1))/2+zero*(n-zero);
ll pp=total-zp-np;
if(k<=np)
{
    ll l=-2*llmax;
    ll r=0;
    ll mid;
    while(l<=r)
    {
      mid=(l+r)/2;
      if(check(mid)<k)
      l=mid+1;
      else
      r=mid-1;
    }
    if(check(l-1)==k)
    l--;
    cout<<l;
    return ;
    
}
else if(k<=(np+zp))
{
    cout<<0;
    return ;
}
else
{
    k-=(zp+np);
    //deb(k);
    ll l=0;
    ll r=2*llmax;
    ll mid;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(check1(mid)<k)
        l=mid+1;
        else
        r=mid-1;
        //deb(mid,check1(mid));
    }
    if(check1(l-1)==k)
    l--;
    cout<<l;
}
return ;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int test=1;
// 	cin>>test;
    for(int i=1;i<=test;i++)
    {
        solveforthiscase(i);
    }
}

Measured memory_bytes: 4592