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

#define debug(x) cout <<"DEBUG"<<" "<< #x << ":" << x << '\n'

// n回繰り返し
#define rep(i,n) for(int i = 0; i < ((int)(n)); i++)   // 0-indexed昇順
#define rep1(i,n) for(int i = 1; i <= ((int)(n)); i++) // 1-indexed昇順
#define rrep(i,n) for(int i = ((int)(n)-1); i >= 0; i--)  // 0-indexed降順
#define rrep1(i,n) for(int i = ((int)(n)); i >= 1; i--)   // 1-indexed降順
#define all(x) (x).begin(),(x).end()

typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vii;  // 2次元配列
typedef vector<ll> vll;
typedef vector<double> vd;
typedef pair<int, int> PII;

template<typename T>
using vec = vector<T>;
template<class T>
using maxheap = std::priority_queue<T>;
template<class T>
using minheap = std::priority_queue<T, std::vector<T>, std::greater<T>>;

template<class T,class U> inline bool chmax(T &a, const U &b){if(a<b){a=b;return 1;}return 0;}
template<class T,class U> inline bool chmin(T &a, const U &b){if(a>b){a=b;return 1;}return 0;}

const ld Pi = std::acos(-1.0L);
const ll infll = (1LL<<62)-1;
const int inf = (1<<30)-1;
const int mod = 1000000007;
// const int mod = 998244353;


/*FUNCs=================================================*/


/*MAIN==================================================*/
signed main(){
    int _StartTime_ = clock();
    cin.tie(nullptr);
    ios::sync_with_stdio(false);   //cin cout 高速化
    // cout << fixed << setprecision(15);

    ll n,k, a; cin >> n >> k;
    vll Minus, Plus;
    rep(i,n) {
        cin >> a;
        if(a < 0) Minus.push_back(a);
        else if(a > 0) Plus.push_back(a);
    }
    sort(all(Minus));
    sort(all(Plus));

    // size
    ll p = Plus.size();
    ll m = Minus.size();
    ll z = n-p-m;

    // X以下の数がK個以上となる最小のXを求める
    // 以下の実装では "mid以下の数がk個以上となる最小のmidを求める" ようになっている

    ll ok = infll, mid, ng = -infll, cnt;
    bool can;
    if(k <= p*m) {  // answer < 0
        while(ok-ng > 1) {
            mid = (ok+ng)/2;
            can = [&](){
                cnt = 0;
                for(auto pl : Plus) {
                    cnt += partition_point(all(Minus), [&](ll x){ return x*pl <= mid;}) - Minus.begin();
                }
                return cnt >= k;
            }();
            if(can) ok = mid;
            else ng = mid;
        }
    }
    else if(k <= p*m+z*(z-1)/2 + z*(p+m)) {  // answer is 0
        ok = 0;
    }
    else {  // answer > 0
        k -= p*m+z*(z-1)/2 + z*(p+m);
        rep(i,m) Minus[i] *= (-1); // ここでMinusを絶対値にして逆順にしないと壊れます
        reverse(all(Minus));
        while(ok-ng > 1) {
            mid = (ok+ng)/2;
            can = [&](){
                cnt = 0;
                for(int i = 0; i < p; ++i) {
                    auto pl = Plus[i];
                    ll tmp = partition_point(all(Plus), [&](ll x){ return x*pl <= mid;}) - Plus.begin();
                    bool used_same = (i < tmp);
                    if(used_same) --tmp;
                    cnt += tmp;
                }
                for(int i = 0; i < m; ++i) {
                    auto mi = Minus[i];
                    ll tmp = partition_point(all(Minus), [&](ll x){ return x*mi <= mid;}) - Minus.begin();
                    bool used_same = (i < tmp);
                    if(used_same) --tmp;
                    cnt += tmp;
                }
                cnt /= 2;
                return cnt >= k;
            }();
            if(can) ok = mid;
            else ng = mid;
        }
    }
//    debug(k);
    cout << ok << '\n';

    // printf("ExecutionTime: %d /ms\n",1000*(int)((clock()-_StartTime_)/CLOCKS_PER_SEC));
}

Measured memory_bytes: 2420