#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
 #define int long long

#define all(X) (X).begin(), (X).end()
#define reset(X) memset(X, 0, sizeof(X))
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define endl '\n'
#define fi first
#define se second


using namespace __gnu_pbds;
using namespace std;
const int mod=1e9+7;
 // const int mod=998244353;
 // const int mod=1e9+9;
// const int INF=4e18+10;
const int INF=4e18+10;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define read(n) int n; cin>>n;
#define readv(x, n) vector<int> x(n); for(auto &i:x) cin>>i;


typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef pair<int, int> pii;

template<typename T1,typename T2>
void set_min(T1& a, T2 b)
{
    a=min(a, (T1)b);
}


int multiply(int a, int b, int in_mod){return (a*b)%in_mod;}
int mult_identity(int a){return 1;}


auto power(auto a, int b, int in_mod)
{
    auto prod=mult_identity(a);
    auto mult=a%in_mod;
    while(b!=0)
    {
        if(b%2)
        {
            prod=multiply(prod,mult, in_mod);

        }
        mult=multiply(mult, mult,in_mod);
        b/=2;
    }
    return prod;
}
int mod_inv(int q, int in_mod)
{

    return power(q, in_mod-2,in_mod);
}

int f(int mid , const vector<int>& a)
{
    vector<int> pos, neg;
    int z_count=0;
    for(auto i:a)
    {
        if(i<0)
            neg.pb(i);
        if(i>0)
            pos.pb(i);
        if(i==0)
            z_count++;
    }


    sort(all(pos));
    sort(all(neg));
    int ans=0;
    if(mid>=0)
    {
        ans+=neg.size()*pos.size();
        ans+=z_count* (pos.size() +neg.size());
        ans += z_count *(z_count-1)/2;
    }
    else
    {
        //a bit of pointing

        int r=pos.size() -1;
        reverse(all(pos));
        for(int l =0;l<neg.size();l++)
        {
            while(r>=0 && neg[l]*pos[r]>mid)
            {
                r--;
            }
            ans+= r+1;
        }
    }

    for(auto &i:neg)
    {
        i=-i;
    }
    sort(all(pos));
    sort(all(neg));
    int fake_ans=0;
    int r= neg.size()-1;

    for(int l =0;l<neg.size();l++)
    {
        while(r>=0 && neg[l]*neg[r]>mid)
        {
            r--;
        }
        fake_ans+= r+1;
        if(r>=l)
            fake_ans--;
    }
    assert(fake_ans%2==0);
    r= pos.size()-1;

    for(int l =0;l<pos.size();l++)
    {
        while(r>=0 && pos[l]*pos[r]>mid)
        {
            r--;
        }
        fake_ans+= r+1;
        if(r>=l)
            fake_ans--;
    }
    assert(fake_ans%2==0);
    ans +=fake_ans/2;
    return ans;

}

void solve()
{
    int n;
    cin>>n;
    int k;
    cin>>k;
    vector<int> a(n);
    for(int i=0;i<n;i++)
        cin>>a[i];

    sort(all(a));

    //sad binary search

    int lo = -INF, hi = INF;
    while(lo<hi-1)
    {
        int mid = (lo+hi)/2;
        if(f(mid, a)>=k)
        {
            hi = mid;
        }
        else
        {
            lo = mid+1;
        }
    }
    if(f(lo, a)>=k)
        hi=lo;
    cout<<hi<<endl;


}

signed main()

{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    #ifndef ONLINE_JUDGE
    if(fopen("INPUT.txt","r"))
    {
        freopen ("INPUT.txt" , "r" , stdin);
        freopen ("OUTPUT.txt" , "w" , stdout);
    }
    #endif
    auto clk=clock();
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    // -------------------------------------Code starts here---------------------------------------------------------------------

    int t=1;
    // cin>>t;
    for(int test=1;test<=t;test++)
    {
        // cout<<"Case #"<<test<<": ";
        // cout<<endl;
        solve();
        // cout<<endl;

    }

    // -------------------------------------Code ends here------------------------------------------------------------------


    clk = clock() - clk;
    cerr << fixed << setprecision(6) << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n";
    return 0;
}


Measured memory_bytes: 5252