#include <bits/stdc++.h>

#define rep(i, a, b) for (int i = a; i < (int)(b); ++i)
#define rrep(i, a, b) for (int i = b - 1; i >= (int)(a); --i)

using namespace std;

using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;

// // O(n)
// ll check_over_x(const vll& v1, const vll& v2, ll x) {
//     ll sum = 0;
//     int n1 = v1.size(), n2 = v2.size();
//     int i = 0;

//     rrep(j, 0, n2) {
//         while (i < n1 && v1[i] * v2[j] < x) { ++i; }
//         if (i == n1) { break; }
//         sum += n1 - i;
//     }

//     // rep(i, 0, n1) {
//     //     sum += distance(lower_bound(v2.begin(), v2.end(), (long double)(x) / v1[i]), v2.end());
//     // }

//     return sum;
// }

// // O(n)
// ll check_under_x(const vll& v, ll x) {
//     ll sum = 0;
//     int n = v.size();
//     int i = 0, j = n - 1;

//     while (i < j) {
//         while (i < j && v[i] * v[j] > x) { --j; }
//         if (i == j) { break; }
//         sum += j - i;
//         ++i;
//     }

//     // for(auto itr = v.begin(); itr != v.end(); ++itr) {
//     //     sum += distance(itr, upper_bound(next(itr), v.end(), (long double)(x) / *itr)) - 1;
//     // }

//     return sum;
// }

ll ce(ll a, ll b) {
    if (a > 0) {
        return (a + b - 1) / b;
    } else {
        return a / b;
    }
}

ll fl(ll a, ll b) {
    if (a < 0) {
        return (a - b + 1) / b;
    } else {
        return a / b;
    }
}

ll check_over_x(const vll& a, ll x) {
    int n = a.size();
    ll sum = 0;
    rep(i, 0, n) {
        if (a[i] < 0) {
            ll target = ce(-x, -a[i]);
            sum += i - (distance(a.begin(), lower_bound(a.begin(), a.begin() + i, target)));
        } else if (a[i] == 0) {
            if (x >= 0) { sum += i; }
        } else {
            ll target = fl(x, a[i]);
            sum += distance(a.begin(), upper_bound(a.begin(), a.begin() + i, target));
        }
    }

    return sum;
}

int main() {
    ll n, k;
    cin >> n >> k;

    vll a(n);
    rep(i, 0, n) { cin >> a[i]; }
    sort(a.begin(), a.end());
    ll left = -1e18, right = 1e18;

    while (left + 1 < right) {
        ll mid = (left + right) / 2;
        ll sum = check_over_x(a, mid);
        if (sum >= k) {
            right = mid;
        } else {
            left = mid;
        }
    }
    cout << right << endl;

    // vll plus, minus;
    // int np = 0, nz = 0, nm = 0;

    // rep(i, 0, n) {
    //     int a;
    //     cin >> a;
    //     if (a > 0) {
    //         plus.push_back(a);
    //         ++np;
    //     } else if (a < 0) {
    //         minus.push_back(-a);
    //         ++nm;
    //     } else {
    //         ++nz;
    //     }
    // }

    // // O(nlog(n))
    // sort(plus.begin(), plus.end());
    // sort(minus.begin(), minus.end());

    // if (np * nm >= k) {
    //     ll l = 1, r = plus.back() * minus.back();
    //     ll mid;

    //     while (l != r) {
    //         mid = (l + r + 1) / 2;
    //         ll z = check_over_x(plus, minus, mid);

    //         if (z < k) {
    //             r = mid - 1;
    //         } else {
    //             l = mid;
    //         }
    //     }
    //     cout << -r << endl;
    //     return 0;
    // }

    // k -= np * nm;

    // if ((nz * (2 * n - nz - 1)) / 2 >= k) {
    //     cout << 0 << endl;
    //     return 0;
    // }

    // k -= (nz * (2 * n - nz - 1)) / 2;

    // // O(nlog(n))
    // ll l = 1;
    // ll r = 1;
    // if (np >= 2) { r = max(r, plus.back() * plus[np - 2]); }
    // if (nm >= 2) { r = max(r, minus.back() * minus[nm - 2]); }
    // ll mid;

    // while (l != r) {
    //     mid = (l + r) / 2;
    //     ll z = check_under_x(plus, mid) + check_under_x(minus, mid);

    //     if (z < k) {
    //         l = mid + 1;
    //     } else {
    //         r = mid;
    //     }
    // }
    // cout << l << endl;
    // return 0;
}

Measured memory_bytes: 1792