#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<int, int> i_i;

#define reps(i,s,n) for(int i = s; i < n; i++)
#define rep(i,n) reps(i,0,n)
#define ALL(v) v.begin(), v.end()
#define SZ(x) ((ll)(x).size())

const double PI  = acos(-1.0);
const double EPS = 1e-9;
const ll INF = 1e9+10;
const ll mod = 998244353;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
#define print(x) cerr << #x << " is " << x << endl;
//#define print(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl; 


vector<ll> pos, neg;

// pos の要素とnegの要素の積がx以上になる要素を数える
ll C(ll x){
    assert(x >= 0);
    ll ans = 0;
    rep(i, SZ(pos)){
        // neg が(x/pos[i]の切り上げ値)以上である数を数える
        ans += neg.end() - lower_bound(ALL(neg), (x + pos[i] - 1LL)/pos[i]);
    }
    return ans;
}
ll detect_negative(ll K){ // 負の数
    ll lb = -ll(1e18) - 1;
    ll ub = -1;
    //cout << lb << endl;
    //lb -= 10LL;
    //cout << lb << endl;
    while (ub - lb > 1LL){
        ll mid = (ub + lb)/2;
        //cout << lb << " " << ub << " " << C(-mid) << endl;
        //fprintf(stderr, "lb = %Ld, ub = %Ld, C(%Ld) = %Ld, K = %Ld\n",
        //    lb, ub, mid, C(-mid), K);
    
        if (C(-mid) >= K){
            ub = mid;
        } else {
            lb = mid;
        }
    }
    return ub;
}

// pos の要素と別のposの要素の積がx以下になる要素を数える
ll D(ll x){
    assert(x >= 0);
    ll ans0 = 0, ans = 0, sqr = 0;
    rep(i, SZ(pos)){
        // pos が(x/pos[i])以下である数を数える
        ans0 += upper_bound(ALL(pos), x/pos[i]) - pos.begin();
        if (pos[i] * pos[i] <= x){
            sqr ++;
        }
    }
    ans += (ans0 - sqr)/2;
    
    ans0 = sqr = 0;
    rep(i, SZ(neg)){
        // neg が(x/neg[i])以下である数を数える
        ans0 += upper_bound(ALL(neg), x/neg[i]) - neg.begin();
        if (neg[i] * neg[i] <= x){
            sqr ++;
        }
    }
    ans += (ans0 - sqr)/2;
    
    return ans;
}

ll detect_positive(ll K){ // 正の数
    ll lb = 0LL, ub = 1e18;
    while (ub - lb > 1){
        ll mid = (ub + lb)/2;
        if (D(mid) >= K){
            ub = mid;
        } else {
            lb = mid;
        }
    }
    return ub;
}

int main() {
    ll N, K;
    cin >> N >> K;
    vector<ll> A(N);
#if 0    
    N = 199998;
    K = N/2;
    vector<ll> A(N);
    rep(i, N/3){
        A[i * 3]= -1000000000LL;
        A[i * 3 + 1]= 1000000000LL;
        A[i * 3 + 2]= 0;
    }
#endif   
    ll zeros;
    rep(i, N){
        cin >> A[i];
        if (A[i] > 0)pos.push_back(A[i]);
        if (A[i] < 0)neg.push_back(-A[i]);
    }
    sort(ALL(pos));
    sort(ALL(neg));
    zeros = N - SZ(pos) - SZ(neg);
    //cout << N << " " << SZ(pos) << " " << SZ(neg) << endl;
    if (K <= SZ(pos) * SZ(neg)){
        cout << detect_negative(K); // 負の数
        return 0;
    }
    K -= SZ(pos) * SZ(neg);
    if (K <= zeros * (N - zeros) + zeros * (zeros - 1)/2){
        cout << 0; // zero
        return 0;
    }
    K -= zeros * (N - zeros) + zeros * (zeros - 1)/2;
    cout << detect_positive(K); // 正の数
    return 0;
}


Measured memory_bytes: 3956