#include<cstdio> #include<cassert> #include<iostream> #include<algorithm> #include<vector> #define pb push_back using namespace std; typedef long long LL; const int N=2e5+5; const LL INF=1e18; vector<LL>pos,neg; int main() { int n; LL k; scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++) { int a; scanf("%d",&a); if(a>0)pos.pb(a); else if(a<0)neg.pb(a); } sort(pos.begin(),pos.end()); sort(neg.begin(),neg.end()); LL ne=1LL*neg.size()*pos.size(); LL po=1LL*pos.size()*(pos.size()-1)/2+1LL*neg.size()*(neg.size()-1)/2; LL ze=1LL*n*(n-1)/2-ne-po; if(k<=ne) { LL l=-INF,r=0,ans; while(l<=r) { LL mid=(l+r)/2,num=0; for(int i=0;i<neg.size();i++) { LL t=mid%neg[i]?mid/neg[i]+1:mid/neg[i]; int x=lower_bound(pos.begin(),pos.end(),t)-pos.begin(); num+=pos.size()-x; } if(num<k)l=mid+1; else r=mid-1,ans=mid; } cout<<ans; } else if(k<=ne+ze)puts("0"); else { LL l=0,r=INF,ans; while(l<=r) { LL mid=(l+r)/2,num=0; for(int i=0;i<pos.size();i++) { if(pos[i]*pos[i]<=mid)num--; LL t=mid/pos[i]; int x=lower_bound(pos.begin(),pos.end(),t+1)-pos.begin(); if(x)assert(pos[x-1]*pos[i]<=mid); if(x<pos.size())assert(pos[x]*pos[i]>mid); num+=x; } for(int i=0;i<neg.size();i++) { if(neg[i]*neg[i]<=mid)num--; LL t=mid/neg[i]; int x=lower_bound(neg.begin(),neg.end(),t)-neg.begin(); assert(neg[x]*neg[i]<=mid); if(x)assert(neg[x-1]*neg[i]>mid); num+=neg.size()-x; } assert(num%2==0); num=num/2+ze+ne; if(num<k)l=mid+1; else r=mid-1,ans=mid; } cout<<ans; } return 0; }