Problem:
Score: 400 points

Problem Statement

We have N integers A_1, A_2, ..., A_N.

There are \frac{N(N-1)}{2} ways to choose two of them and form a pair. If we compute the product of each of those pairs and sort the results in ascending order, what will be the K-th number in that list?

Constraints

All values in input are integers.

2 \leq N \leq 2 \times 10^5

1 \leq K \leq \frac{N(N-1)}{2}

-10^9 \leq A_i \leq 10^9\ (1 \leq i \leq N)

Input

Input is given from Standard Input in the following format:

N K
A_1 A_2 \dots A_N

Output

Print the answer.

Sample Input 1

4 3
3 3 -4 -2

Sample Output 1

-6

There are six ways to form a pair. The products of those pairs are 9, -12, -6, -12, -6, 8.

Sorting those numbers in ascending order, we have -12, -12, -6, -6, 8, 9. The third number in this list is -6.

Sample Input 2

10 40
5 4 3 2 -1 0 0 0 0 0

Sample Output 2

6

Sample Input 3

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

Sample Output 3

448283280358331064

Solution in C (GCC 5.4.1) (judge verdict: Runtime Error)


#include<stdio.h>


#define SWAP(type,a,b) { type work = a; a = b; b = work; }

/*
    基準値を選ぶ
*/
long int select_pivot(long int* array, long int begin, long int end)
{
    return array[(begin + end) / 2];  // 中央の要素を基準値とする
}


/*
    クイックソート (再帰部分、昇順)
*/
void quick_sort_rec(long int* array, long int begin, long int end)
{
    long int pivot = select_pivot( array, begin, end );
    long int i = begin;
    long int j = end;

    while( 1 ){
        while( array[i] < pivot ){ ++i; }  // 基準値以上の値が見つかるまで右方向へ進めていく
        while( array[j] > pivot ){ --j; }  // 基準値以下の値が見つかるまで左方向へ進めていく

        if( i >= j ){ break; }  // 左右から進めてきたiとjがぶつかったらループを終える

        // 基準値の位置よりも左側にあり、基準値よりも大きい値 (array[i]) と、
        // 基準値の位置よりも右側にあり、基準値よりも小さい値 (array[j]) の
        // 位置関係を交換する。
        SWAP(long int, array[i], array[j] );

        // 次回に備えて、注目点をずらす
        i++;
        j--;
    }


    // 基準値の位置より左側に要素が２つ以上あれば、
    // その部分についてクイックソートを再帰させる
    if( i - begin >= 2 ){
        quick_sort_rec( array, begin, i - 1 );
    }

    // 基準値の位置より右側に要素が２つ以上あれば、
    // その部分についてクイックソートを再帰させる
    if( end - j >= 2 ){
        quick_sort_rec( array, j + 1, end );
    }
}


void sort(long int* array, long int size){
    // 配列全体を対象にする
    quick_sort_rec( array, 0, (long int)(size - 1) );
}

void set_data(long int data[], long int n){
    for(long int i = 0; i < n; i++){
        scanf("%ld", &data[i]);
    }
}

void calc_data(long int data[], long int pair[], long int n){
    long int x = 0;
    for(long int i = 0; i < n; i++){
        for(long int j = 0; j < i; j++){
            pair[x] = data[i] * data[j];
            /*`printf("%ld ", pair[x]);*/
            x++;
        }
    }
    /*printf("\n");*/
}

void print_array(long int data[], long int n){
    for(long int i = 0; i < n; i++){
        printf("%ld ", data[i]);
    }
    printf("\n");
}

int main(void){
    long int n, k;
    scanf("%ld""%ld", &n, &k);
    long int data[n], pairs[(n * (n - 1)) / 2];
    set_data(data, n);
    /*print_array(data, n);*/
    calc_data(data, pairs, n);

    /*print_array(pairs, (n * (n - 1)) / 2);*/
    sort(pairs, (n * (n - 1)) / 2 );
    
    printf("%ld\n", pairs[k - 1]);
}