#include <bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<lint> vlint;

#define inf INT_MAX
#define linf LLONG_MAX
#define endl "\n"
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n); i++)
#define all(x) (x).begin(), (x).end()

#define pb push_back
#define eb emplace_back
#define Size(c) (int)(c).size()

#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))

template <class T> using pq = priority_queue<T>;
template <class T> using pqg = priority_queue<T, vector<T>, greater<T>>;

template <class T, class S> inline bool chmax(T &a, S b) {
    if(a < b) {a = b;return 1;} return 0;
}
template <class T, class S> inline bool chmin(T &a, S b) {
    if(a > b) {a = b;return 1;} return 0;
}
template <class T>
void line(vector<T> &x){for (auto&& xi : x) cin >> xi;}

inline void IN(void){ return;}

template <typename First, typename... Rest>
void IN(First& first, Rest&... rest){ cin >> first; IN(rest...); return;}

#define INT(...) int __VA_ARGS__; IN (__VA_ARGS__)
#define LINT(...) lint __VA_ARGS__; IN (__VA_ARGS__)
#define STR(...) string __VA_ARGS__; IN(__VA_ARGS__)

template <class T> void UNIQUE(vector<T> &x) {
    sort(all(x)); x.erase(unique(all(x)), x.end());
}
template <class T> void print_vec(T first, T end){
    for (auto i = first; i < end - 1; i++) cout << *i << " ";
    cout << *(end-1) << endl;
}
template <class T> void print(T a){ cout << a << endl;};
vector<string> Yes = {"No", "Yes"};
vector<string> YES = {"NO", "YES"};

lint cnt_over_p(lint x, vlint a){
    lint s = Size(a);
    lint left = 0; lint right = s-1;
    lint ret = 0;
    while (left <= right){
        if (left == right){
            break;
        }
        if (a[left] * a[right] > x){
            right --;
        }
        else{
            ret += right - left;
            left ++;
        };
    }
    return ret;
}
lint cnt_p(lint x, vlint a, vlint b){
    return cnt_over_p(x, a) + cnt_over_p(x, b);
}
lint cnt_n(lint x, vlint a, vlint b){
    lint s_a = Size(a);
    lint ret = 0; lint v, o;
    for (auto&& p:b){
        v = x/p; if (x % p != 0) v++;
        o = ub(a, v-1);
        ret += s_a - o;
    }
    return ret;
}
int main(){
    LINT(n, k);
    vlint a(n); line(a);
    vlint pos, neg, zero;
    lint n_cnt = 0, p_cnt = 0, z_cnt = 0;
    for (auto&& p : a){
        if (p == 0) z_cnt++, zero.pb(p);
        else if (p > 0) p_cnt++, pos.pb(p);
        else if (p < 0) n_cnt++, neg.pb(p);
    }
    lint pos_c = p_cnt * (p_cnt-1)/2 + n_cnt * (n_cnt-1)/2;
    lint neg_c = p_cnt * n_cnt;
    lint zero_c = z_cnt * (p_cnt + n_cnt) + z_cnt * (z_cnt-1)/2;

    if (neg_c >= k){
        sort(all(pos));
        lint low = -linf; lint high = 0; lint mid;
        while (low < high){
            mid = (low+high)/2;
            if (cnt_n(mid, pos, neg) <= k-1 && cnt_n(mid+1, pos, neg) > k-1){
                break;
            }
            else if (cnt_n(mid, pos, neg) <= k-1){ low = mid;}
            else{ high = mid;}
        }
        print(mid+1);
        
    }else if (neg_c + zero_c >= k){
        print(0);
    }
    else{
        k -= neg_c + zero_c;
        sort(all(pos)); sort(all(neg)); reverse(all(neg));
        lint low = 0; lint high = linf; lint mid;
        while (low < high){
            mid = (low+high)/2;
            if (cnt_p(mid, pos, neg) <= k-1 && cnt_p(mid+1, pos, neg) > k-1){
                break;
            }
            else if (cnt_p(mid, pos, neg) <= k-1){ low = mid;}
            else{ high = mid;}
        }
        print(mid+1);
    }

}
    



Measured memory_bytes: 10656