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

// varibable settings
#define int long long
const int INF=1e18;

// define basic macro {{{
#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);++i)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define _rrep(i,n) rrepi(i,0,n)
#define rrepi(i,a,b) for(int i=(int)((b)-1);i>=(int)(a);--i)
#define rrep(...) _overload3(__VA_ARGS__,rrepi,_rrep,)(__VA_ARGS__)
#define each(i,a) for (auto&& i : a)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define mt(a, b, c) make_tuple(a, b, c)
#define ub upper_bound
#define lb lower_bound
#define posl(A, x) (lower_bound(all(A), x)-A.begin())
#define posu(A, x) (upper_bound(all(A),x)-A.begin())
template<class T> inline void chmax(T &a, const T &b) { if((a) < (b)) (a) = (b); }
template<class T> inline void chmin(T &a, const T &b) { if((a) > (b)) (a) = (b); }

#define divceil(a,b) ((a)+(b)-1)/(b)
#define is_in(x, a, b) ((a)<=(x) && (x)<(b))
#define uni(x) sort(all(x));x.erase(unique(all(x)),x.end())
#define slice(l, r) substr(l, r-l)

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int,int> pii;
typedef tuple<int,int,int> iii;

template<typename T> using PQ = priority_queue<T, vector<T>, greater<T>>;
struct Fast { Fast(){ std::cin.tie(0); ios::sync_with_stdio(false); } } fast;

#if defined(PCM) || defined(LOCAL)
  #include "lib/dump.hpp"
#else
  #define dump(...) 42
  #define dump_1d(...) 42
  #define dump_2d(...) 42
  #define cerrendl 42
#endif
//}}}

int n,k;
vector<int> a;

int cal(int s, int x){
  int left = -1;
  int right = n;
  auto isright = [&](int j) {
    if (s*a[j]<=x) return true;
    else return false;
  };
  while (right-left>1){
    int mid = (right+left)/2;
    if (isright(mid)) { right = mid;}
    else{ left = mid; }
  }
  return right;
}

int cal2(int s, int x){
  int left = -1;
  int right = n;
  auto isright = [&](int j) {
    if (s*a[j]>x) return true;
    else return false;
  };
  while (right-left>1){
    int mid = (right+left)/2;
    if (isright(mid)) { right = mid;}
    else{ left = mid; }
  }
  // dump(s, x, right);
  return right - 1;
}

signed main() {
  cin>>n>>k;
  a = vi(n);/*{{{*/
  int x = 0;
  int y = 0;
  int z = 0;

  vi p, q;
  rep(i, n) {
    cin>>a[i];
    if (a[i]>0){
      x++;
      p.pb(a[i]);
    }
    if (a[i]==0){
      z++;
    }
    if (a[i]<0){
      y++;
      q.pb(a[i]);
    }
  }
  sort(all(a));
  sort(all(p));
  sort(all(q));

  dump(a);
  dump(p);
  dump(q);/*}}}*/

  int left = -1e18-1;
  int right = 1e18+1;
  auto isright = [&](int x) {
    cerrendl;
    int cnt = 0;
    dump(x);
    rep(i, sz(a)){
      // dump(i, a[i]);
      if (a[i]<0){
        int j = cal(a[i], x);
        if (j==n) continue;
        cnt += n-j;
        if (j<=i) cnt--;
        // dump(i, cnt);
      }
      if (a[i]==0){
        if (x>=0) cnt += n-1;
        // dump(i, cnt);
      }
      if (a[i]>0){
        int j = cal2(a[i], x);
        if (j==-1) continue;
        cnt += j+1;
        if (i<=j) cnt--;
      }
      // dump(i, cnt);
    }
    dump(x, k);
    if ((cnt/2)>=k) return true;
    else return false;
  };
  while (right-left>1){
    int mid = (right+left)/2;
    if (isright(mid)) { right = mid;}
    else{ left = mid; }
  }

  cout << right << endl;

  return 0;
}


Measured memory_bytes: 3956