#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <algorithm>
#include <sstream>
#include <climits>
#include <fstream>
#include <cmath>

using namespace std;

/// ********* debug template by Bidhan Roy *********

template < typename F, typename S >
ostream& operator << ( ostream& os, const pair< F, S > & p ) {
    return os << "(" << p.first << ", " << p.second << ")";
}

template < typename T >
ostream &operator << ( ostream & os, const vector< T > &v ) {
    os << "{";
    typename vector< T > :: const_iterator it;
    for( it = v.begin(); it != v.end(); it++ ) {
        if( it != v.begin() ) os << ", ";
        os << *it;
    }
    return os << "}";
}

template < typename T >
ostream &operator << ( ostream & os, const set< T > &v ) {
    os << "[";
    typename set< T > :: const_iterator it;
    for ( it = v.begin(); it != v.end(); it++ ) {
        if( it != v.begin() ) os << ", ";
        os << *it;
    }
    return os << "]";
}

template < typename T >
ostream &operator << ( ostream & os, const unordered_set< T > &v ) {
    os << "[";
    typename unordered_set< T > :: const_iterator it;
    for ( it = v.begin(); it != v.end(); it++ ) {
        if( it != v.begin() ) os << ", ";
        os << *it;
    }
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const map< F, S > &v ) {
    os << "[";
    typename map< F , S >::const_iterator it;
    for( it = v.begin(); it != v.end(); it++ ) {
        if( it != v.begin() ) os << ", ";
        os << it -> first << ": " << it -> second ;
    }
    return os << "]";
}

template < typename F, typename S >
ostream &operator << ( ostream & os, const unordered_map< F, S > &v ) {
    os << "[";
    typename unordered_map< F , S >::const_iterator it;
    for( it = v.begin(); it != v.end(); it++ ) {
        if( it != v.begin() ) os << ", ";
        os << it -> first << ": " << it -> second ;
    } 
    return os << "]";
}

#define debug(x) cerr << #x << " = " << x << endl;

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef pair<double, double> PDD;
typedef vector<bool> VB;
typedef vector<int> VI;
typedef vector<char> VC;
typedef vector<LL> VLL;
typedef vector<double> VD;
typedef vector<string> VS;
typedef vector<VB> VVB;
typedef vector<VI> VVI;
typedef vector<VC> VVC;
typedef vector<VLL> VVLL;
typedef vector<VD> VVD;
typedef vector<VS> VVS;

// TEMPLATE DEFINITIONS END

LL div_floor(LL a, LL b) {
	return a / b - (((a ^ b) < 0) and a % b);
}

LL div_ceil(LL a, LL b) {
	return a / b + (((a ^ b) >= 0) and a % b);
}

LL n, k, x, cnt_zero = 0;
vector<LL> a;

void read_input(){

    cin >> n >> k;
    a.resize(n);

    for(int i=0;i<n;i++) cin >> a[i];
}

LL f(LL limit){

    LL sol = 0;

    for(int i=0;i<n;i++){

        if(a[i] == 0){
            if(limit >= 0) sol += (n - 1);
        }else
        if(a[i] < 0){
            // a[i] * x <= limit
            // x >= limit / a[i], as a[i] < 0
            // x >= ceil(limit / a[i])

            // LL x = (LL)ceil((double)limit / a[i]);
            LL x = div_ceil(limit, a[i]);
            LL idx = (LL)(lower_bound(a.begin(), a.end(), x) - a.begin());
            if(idx <= i)
                sol += n - idx - 1;
            else
                sol += n - idx;
        }else{
            
            // a[i] * x <= limit
            // x <= limit / a[i], as a[i] > 0
            // x <= floor(limit / a[i])

            // LL x = (LL)floor((double)limit / a[i]);
            LL x = div_floor(limit, a[i]);
            LL idx = (LL)(upper_bound(a.begin(), a.end(), x) - a.begin());
            
            if(idx > i)
                sol += idx - 1;
            else
                sol += idx;
        }
    }

    return sol / 2;
}

void solve(){

    sort(a.begin(), a.end());
    
    LL l = LLONG_MIN / 2, r = LLONG_MAX / 2, solution = 0;
    
    while(l < r){
        
        LL m = l + (r - l) / 2;
        // cout << l << " " << m << " " << r << "\n";
        
        if(f(m) >= k){
            solution = m;
            r = m;
        }else{
            l = m + 1;
        }
    }

    cout << solution << "\n";
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    read_input();
    solve();
    return 0;
}


Measured memory_bytes: 1792