#include "bits/stdc++.h"
using namespace std;
#define ll long long int
#define rep(i,n) for( int i = 0; i < n; i++ )
#define rrep(i,n) for( int i = n; i >= 0; i-- )
#define REP(i,s,t) for( int i = s; i <= t; i++ )
#define RREP(i,s,t) for( int i = s; i >= t; i-- )
#define dump(x)  cerr << #x << " = " << (x) << endl;
#define INF 2000000000
#define mod 1000000007
#define INF2 4000000000000000000
#define int long long

vector<int> v1, v2, v3;
int N, K;
int A[200010];
int zero;

int count_negative(int num) {
    int ret = 0;
    rep(i, v1.size()) {
        auto itr = lower_bound(v2.begin(), v2.end(), (num + v1[i] + 1)/v1[i]);
        int pos = distance(v2.begin(), itr);
        ret += v2.size() - pos;
        //cout << "*"<< num << " " << v1[i] << " " << (num  + v1[i] + 1)/v1[i] << " " <<  v2.size() - pos << endl;
    }
    return ret;
}

int count_zero(int num) {
    if (num < 0) return 0;
    int ret = 0;
    rep(i, zero) ret += N - i - 1;
    return ret;
}

int count_positive1(int num) {
    int ret = 0;
    rep(i, (int)v2.size() - 1) {
        auto itr = upper_bound(v2.begin() + i + 1, v2.end(), num/v2[i]);
        int pos = distance(v2.begin() + i + 1, itr);
        ret += pos;
        //cout << v2[i] << " " << num/v2[i] << " " <<  pos << endl;
    }
    return ret;
}
int count_positive2(int num) {
    int ret = 0;
    rep(i, v3.size()) {
        auto itr = upper_bound(v3.begin() + i + 1, v3.end(), num/v3[i]);
        int pos = distance(v3.begin() + i + 1, itr);
        ret += pos;
        //cout << "*" << num << " " << v3[i] << " " << num/v3[i] << " " <<  pos << endl;
    }
    return ret;
}



bool isOk(int num, int key) {
    int cnt = 0;
    cnt += count_negative(num);
    cnt += count_zero(num);
    cnt += count_positive1(num);
    cnt += count_positive2(num);
    //cout << num << " " << count_negative(num) << " " << count_zero(num) << " " << count_positive1(num) << " " << count_positive2(num) << endl;
    return cnt >= key;
} 

int binary_search(int key) {
    int ng = -INF2;
    int ok = INF2;
    while(abs(ng - ok) > 1) {
        int mid = (ng + ok) / 2;
        if(isOk(mid, key)) {
            ok = mid;
        } else {
            ng = mid;
        }
    }
    return ok;
}

int correct(int K) {
    vector<int> v;
    rep(i, N) {
        REP(j, i + 1, N - 1) {
            v.push_back(A[i] * A[j]);
        }
    }
    sort(v.begin(), v.end());
    return v[K - 1];
}

signed main(void)
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> N >> K;
    
    rep(i, N) {
        cin >> A[i];
    }
    sort(A, A + N);
    rep(i, N) {
        if (A[i] < 0) {
            v1.push_back(A[i]);
            v3.push_back(-A[i]);
        }
        else if (A[i] == 0) zero++;
        else v2.push_back(A[i]);
    }
    //v2.push_back(INF);
    sort(v3.begin(), v3.end());
    // REP(i, 0, 30) {
    //     int c = count_positive2(i);
    //     cout << i << " " << c << endl;
    // }
    //cout << v1.size() << " " << zero << " " << v2.size() << endl;
    cout << binary_search(K) << endl;
    // REP(i, 1, 1) {
    //     int a = binary_search(i);
    //     int b = correct(i);

    //     cout << i << " " << a << " " << b << endl;
    // }
    

    return 0;
}


Measured memory_bytes: 5100