unittest
{
	assert( [ "4 3", "4 3 -4 -2" ].parse.expand.solve == -8 );		// 追加ケース
	assert( [ "10 40", "-5 -4 -3 -2 1 0 0 0 0 0" ].parse.expand.solve == 6 );		// 追加ケース
	
	assert( [ "4 3", "3 3 -4 -2" ].parse.expand.solve == -6 );
	assert( [ "10 40", "5 4 3 2 -1 0 0 0 0 0" ].parse.expand.solve == 6 );
	assert( [ "30 413", "-170202098 -268409015 537203564 983211703 21608710 -443999067 -937727165 -97596546 -372334013 398994917 -972141167 798607104 -949068442 -959948616 37909651 0 886627544 -20098238 0 -948955241 0 -214720580 277222296 -18897162 834475626 0 -425610555 110117526 663621752 0" ].parse.expand.solve == 448283280358331064 );
	
	assert( ( [ "200000 19999900000" ] ~ iota( 1, 200001 ).map!( ( a ) => a.to!( string ) ).join( " " ) ).parse.expand.solve == 39999800000 );		// 追加ケース
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nk = input.front.split.to!( long[] );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( nk[ 1 ], as );
}

auto solve( long k, long[] as )
{
	// マイナス、ゼロ、プラスに分類
	auto as_s = as.sort();
	auto ts = as_s.trisect( 0 );
	auto ms = ts[ 0 ].retro.array;
	auto zs = ts[ 1 ];
	auto ps = ts[ 2 ].array;
	
	// 積がマイナス、ゼロ、プラスになるペアの数を計算
	auto mc = ms.length.signed * ps.length.signed;
	auto pc = ms.length.signed * ( ms.length.signed - 1 ) / 2 + ps.length.signed * ( ps.length.signed - 1 ) / 2;
	auto zc = as.length.signed * ( as.length.signed - 1 ) / 2 - mc - pc;
	
	// 積がマイナスになるペア (m,p) の場合
	if( k <= mc ) return minusK( k, ms, ps );
	k -= mc;
	
	// 積がゼロになるペア (z,m)or(z,z)or(z,p) の場合
	if( k <= zc ) return 0;
	k -= zc;
	
	// 積がプラスになるペア (m,m)or(p,p) の場合
	return plusK( k, ms, ps );
}

auto minusK( long k, long[] ms, long[] ps )
{
	// (m,p)のペアの積のうち、小さい順でK番目に来るものを二分探索
	auto l = -10L ^^ 18;
	auto r = 0L;
	while( l < r )
	{
		auto c = ( l + r - 1 ) / 2;
		auto t = 0L;
		auto i = 0L;
		foreach_reverse( m; ms )
		{
			while( i < ps.length && c < m * ps[ i ] ) i++;
			t += ps.length.signed - i;
		}
		if( t < k ) l = c + 1;
		else        r = c;
	}
	return l;
}

auto plusK( long k, long[] ms, long[] ps )
{
	// (m,m)or(p,p)のペアの積のうち、小さい順でK番目に来るものを二分探索
	auto l = 0L;
	auto r = 10L ^^ 18;
	while( l < r )
	{
		auto c = ( l + r - 1 ) / 2;
		auto t = 0L;
		auto i = 0L;
		foreach_reverse( j, m; ms )
		{
			while( i < ms.length && m * ms[ i ] <= c ) i++;
			t += i - ( j < i );		// (自分,自分)のペアは除外
		}
		i = 0L;
		foreach_reverse( j, p; ps )
		{
			while( i < ps.length && p * ps[ i ] <= c ) i++;
			t += i - ( j < i );		// (自分,自分)のペアは除外

		}
		t /= 2;		// (x,y)と(y,x)で二重カウントしているので半分除外
		if( t < k ) l = c + 1;
		else        r = c;
	}
	return l;
}
