#pragma region Header

#include <iostream>
#include <iomanip>
#include <vector>
#include <unordered_map>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <array>
#include <tuple>
#include <string>
#include <algorithm>
#include <functional>
#include <cmath>
#include <numeric>
#include <bitset>
#include <cstdint>
#include <stdexcept>
using namespace std;

// 整数型

using i32 = int32_t;
using i64 = int64_t;
using u32 = uint32_t;
using u64 = uint64_t;

// [0,n)を昇順/降順でループ

#define rep(i, n) for (int i = 0; i < static_cast<int>(n); ++i)
#define repd(i, n) for (int i = static_cast<int>(n) - 1; i >= 0; --i)

// [a,b)を昇順/降順でループ

#define FOR(i, a, b) for (int i = static_cast<int>(a); i < static_cast<int>(b); ++i)
#define FORD(i, a, b) for (int i = static_cast<int>(b) - 1; i >= static_cast<int>(a); --i)

template <typename T>
int SZ(T const &x)
{
    return static_cast<int>(x.size());
}

#pragma endregion

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);

    int n;
    i64 k;
    cin >> n >> k;
    --k;

    vector<int> ap, an;
    int n_z = 0;
    rep(i, n)
    {
        int a;
        cin >> a;
        if (a > 0)
        {
            ap.push_back(a);
        }
        else if (a < 0)
        {
            an.push_back(-a);
        }
        else
        {
            ++n_z;
        }
    }
    sort(ap.begin(), ap.end());
    sort(an.begin(), an.end());

    auto sum_upto = [](i64 x) { return x * (x - 1) / 2; };
    i64 cnt_n = (i64)SZ(ap) * SZ(an);
    i64 cnt_z = sum_upto(n_z) + n_z * ((i64)n - n_z);
    i64 cnt_all = sum_upto(n);
    i64 ans;
    if (k < cnt_n)
    {
        // |積| >= x となる個数
        auto count = [&](i64 x) {
            // (l, r) で ap[l] * an[r] >= x となるものの個数
            i64 ret = 0;

            for (int l = SZ(ap) - 1, r = 0; l >= 0; --l)
            {
                // [r,SZ) では条件を満たす最小の r
                // 同値だが, [0,r) では条件を満たさない最大の r
                while (r < SZ(an) and not((i64)ap[l] * an[r] >= x))
                {
                    ++r;
                }

                ret += SZ(an) - r;
            }

            return ret;
        };

        // |(k番目)| >= x となる最大の x を二分探索で求める
        i64 ok = 0, ng = 1'000'000'000'000'000'001LL;
        while (abs(ok - ng) > 1)
        {
            i64 mid = (ok + ng) / 2;
            // |(k番目)| >= mid という条件 ([0,count(mid)) は >= mid となる区間だから)
            if (k < count(mid))
            {
                ok = mid;
            }
            else
            {
                ng = mid;
            }
        }

        ans = -ok;
    }
    else if (k < cnt_n + cnt_z)
    {
        ans = 0;
    }
    else
    {
        // 積 >= x となる個数
        auto count = [&](i64 x) {
            // (l, r) で ap[l] * ap[r] >= x となるものの個数 (r < l)
            i64 ret1 = 0;
            for (int l = SZ(ap) - 1, r = 0; l >= 0; --l)
            {
                while (r < SZ(ap) and not((i64)ap[l] * ap[r] >= x))
                {
                    ++r;
                }

                // はじめから半分で数えておく
                if (l - r <= 0)
                {
                    break;
                }
                // [r,l) の長さ
                ret1 += l - r;
            }

            // (l, r) で an[l] * an[r] >= x となるものの個数 (r < l)
            i64 ret2 = 0;
            for (int l = SZ(an) - 1, r = 0; l >= 0; --l)
            {
                while (r < SZ(an) and not((i64)an[l] * an[r] >= x))
                {
                    ++r;
                }

                if (l - r <= 0)
                {
                    break;
                }
                ret2 += l - r;
            }

            return ret1 + ret2;
        };

        // (k番目) >= x となる最大の x を二分探索で求める
        i64 ok = 0, ng = 1'000'000'000'000'000'001LL;
        while (abs(ok - ng) > 1)
        {
            i64 mid = (ok + ng) / 2;
            // (k番目) >= mid という条件 (左辺ははじめて >= mid となる番号だから)
            if (cnt_all - count(mid) <= k)
            {
                ok = mid;
            }
            else
            {
                ng = mid;
            }
        }

        ans = ok;
    }

    cout << ans << '\n';

    return 0;
}


Measured memory_bytes: 4264