using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;
using static System.Math;
using System.Numerics;

namespace AtCoder
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }
        static public (T1 a, T2 b) Slice<T1, T2>()
        {
            var t = ReadLine().Split();
            return (
            (T1)Convert.ChangeType(t[0], typeof(T1)),
            (T2)Convert.ChangeType(t[1], typeof(T2)));
        }
        static long Mod = (long)1e9 + 7;
        static void Main(string[] args)
        {
            SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
            Solve();
            Out.Flush();
            Read();
        }
        static void Solve()
        {
            (long N, long K) = Slice<long, long>();
            var Ai = Sarray();
            var Am = Ai.Where(a => a < 0).Select(a => -a).ToList();
            var Ap = Ai.Where(a => 0 <= a).ToList();
            Am.Sort();
            Ap.Sort();
            var mNum = (long)Am.Count * Ap.Count;
            var lb = new lb<long>();
            if (mNum < K)//プラスになるものでサーチ Am,AmとAp,Ap
            {
                bool IsOk(long n, long k)
                {//n未満になる組み合わせがk未満ならok
                    var cnt = 0L;
                    for (var i = 0; i < Am.Count; ++i)
                    {
                        if (n == 0) continue;//0未満になるものはない
                        if (Am[i] == 0)//0の場合は全部
                        {
                            cnt += Am.Count - (i + 1);
                            continue;
                        }
                        var s = (n + Am[i] - 1) / Am[i];//かけ合わせたらn以上になるもの
                        var ab = ~Am.BinarySearch(s, lb);
                        ab = Max(0, ab - (i + 1));
                        cnt += ab;
                    }
                    for (var i = 0; i < Ap.Count; ++i)
                    {
                        if (n == 0) continue;
                        if (Ap[i] == 0)
                        {
                            cnt += Ap.Count - (i + 1);
                            continue;
                        }
                        var s = (n + Ap[i] - 1) / Ap[i];
                        var ab = ~Ap.BinarySearch(s, lb);
                        ab = Max(0, ab - (i + 1));
                        cnt += ab;
                    }
                    return cnt < k;
                };
                WriteLine(bSearch(0, (long)1e18 + 1, K - mNum, IsOk));
            }
            else//マイナスになるものでサーチAm,Ap
            {
                bool IsOk(long n, long k)
                {
                    var cnt = 0L;
                    for (var i = 0; i < Am.Count; ++i)
                    {
                        if (n == 0) continue;
                        if (Am[i] == 0)
                        {
                            cnt += Ap.Count;
                            continue;
                        }
                        var s = (n + Am[i] - 1) / Am[i];
                        var ab = ~Ap.BinarySearch(s, lb);
                        cnt += ab;
                    }
                    return cnt < mNum - k + 1;
                };
                WriteLine(-bSearch(0, (long)1e18 + 1, K, IsOk));
            }
        }
        static long bSearch(long ok, long ng, long k, Func<long, long, bool> isOk)
        {
            while (1 < Abs(ok - ng))
            {
                var mid = (ok + ng) / 2;
                if (isOk(mid, k))
                    ok = mid;
                else
                    ng = mid;
            }
            return ok;
        }
        public class lb<T> : IComparer<T> where T : IComparable<T>
        {
            public int Compare(T x, T y) => 0 <= x.CompareTo(y) ? 1 : -1;
        }
    }
}

Measured memory_bytes: 50120