/// kazuki08
/*
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define int long long
typedef long long ll;
// typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int,int> pi;
typedef vector<pi> vpi;
//#define inf 1000000000
#define mod 1000000007
#define dmp(x) cerr<<"line "<<__LINE__<<" "<<#x<<":"<<x<<endl
#define fs first
#define sc second
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define mt make_tuple
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
template<class S,class T> ostream& operator<<(ostream& o,const pair<S,T> &p){
    return o<<"("<<p.fs<<","<<p.sc<<")";
}
template<class T> ostream& operator<<(ostream& o,const vector<T> &vc){
    o<<"{";
    for(const T& v:vc) o<<v<<",";
    o<<"}";
    return o;
}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

typedef tree<
pair<int, int>,
null_type,
less<pair<int, int>>,
rb_tree_tag,
tree_order_statistics_node_update> ordered_set;

ll n,a[202020];
ll k,zero;
vi pos,neg;

bool chk(ll x){
  ll cnt = 0;
  // cerr << "x "  << x << endl;
  // ordered_set s;
  if(x>0){
    int c = 0;
    vpi s;
    for(auto t:pos){
      ll cur = x/t;
      cur = min(cur,(ll)mod);
      cur = max(cur,(ll)-mod);
      pi x = {cur,n+10};
      cnt+= lower_bound(all(s),x)-s.begin();
      // cerr << cur << " " << s.order_of_key({cur,n+10}) << endl;
      s.pb({t,c++});
    }
    // cerr << cnt << endl;
    reverse(all(neg));
    s.clear();
    c = 0;
    for(auto t:neg){
      ll cur = x/abs(t);
      cur = min(cur,(ll)mod);
      cur = max(cur,(ll)-mod);
      pi x = {cur,n+10};
      cnt+= lower_bound(all(s),x)-s.begin();
      // cerr << cur << " " << s.order_of_key({cur,n+10}) << endl;
      s.pb({abs(t),c++});
    }
    reverse(all(neg));
    cnt+= 1LL*zero*(pos.size()+neg.size());
    cnt+= 1LL*zero*(zero-1)/2;
    cnt+= 1LL*pos.size()*neg.size();
    // cerr << cnt << endl;
    return cnt>=k;
  }

  if(x==0){
    cnt+= 1LL*zero*(pos.size()+neg.size());
    cnt+= 1LL*zero*(zero-1)/2;
    cnt+= 1LL*pos.size()*neg.size();
    return cnt>=k;
  }
  int c = 0;
  vpi s;
  for(auto t:neg){
    s.pb({abs(t),c++});
  }
  sort(all(s));
  for(auto t:pos){
    ll cur = (abs(x)+t-1)/t;
    cur = min(cur,(ll)mod);
    cur = max(cur,(ll)-mod);
    pi x = {cur,-1};
    int y = lower_bound(all(s),x)-s.begin();
    cnt+= s.size()-y;
  }
  // cerr << cnt << endl;
  return cnt>=k;

}

signed main(){
IOS;
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
  
  cin >> n >> k;

  for(int i=1;i<=n;i++){
    cin >> a[i];
    if(a[i]>0)pos.pb(a[i]);
    else if(a[i]<0) neg.pb(a[i]);
    else zero++;
  }
  sort(all(pos));
  sort(all(neg));
  sort(a+1,a+n+1);

  // cout << chk(-6) << endl;

  ll l = -2e18, r = 2e18;

  while(r-l>1){
    ll mid = (r+l)/2;
    if(chk(mid)){
      r = mid;
    }
    else l = mid;
  }
  if(chk(l)){
    cout << l << endl;
  }
  else cout << r << endl;


return 0;
}
///....


Measured memory_bytes: 11248