Problem:
Score : 400 points

Problem Statement

Let {\rm comb}(n,r) be the number of ways to choose r objects from among n objects, disregarding order.
From n non-negative integers a_1, a_2, ..., a_n, select two numbers a_i > a_j so that {\rm comb}(a_i,a_j) is maximized.
If there are multiple pairs that maximize the value, any of them is accepted.

Constraints

2 \leq n \leq 10^5

0 \leq a_i \leq 10^9

a_1,a_2,...,a_n are pairwise distinct.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

n
a_1 a_2 ... a_n

Output

Print a_i and a_j that you selected, with a space in between.

Sample Input 1

5
6 9 4 2 11

Sample Output 1

11 6

\rm{comb}(a_i,a_j) for each possible selection is as follows:

\rm{comb}(4,2)=6

\rm{comb}(6,2)=15

\rm{comb}(6,4)=15

\rm{comb}(9,2)=36

\rm{comb}(9,4)=126

\rm{comb}(9,6)=84

\rm{comb}(11,2)=55

\rm{comb}(11,4)=330

\rm{comb}(11,6)=462

\rm{comb}(11,9)=55

Thus, we should print 11 and 6.

Sample Input 2

2
100 0

Sample Output 2

100 0

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

#include <stdio.h>

  /* 配列の要素を交換する */
void Swap(long x[ ], long i, long j)
{
    long temp;

    temp = x[i];
    x[i] = x[j];
    x[j] = temp;
}

void QSort(long x[ ], long left, long right)
{
    long i, j;
    long pivot;

    i = left;                      /* ソートする配列の一番小さい要素の添字 */
    j = right;                     /* ソートする配列の一番大きい要素の添字 */

    pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */

    while (1) {                    /* 無限ループ */

        while (x[i] < pivot)       /* pivot より大きい値が */
            i++;                   /* 出るまで i を増加させる */

        while (pivot < x[j])       /* pivot より小さい値が */
            j--;                   /*  出るまで j を減少させる */
        if (i >= j)                /* i >= j なら */
            break;                 /* 無限ループから抜ける */

        Swap(x, i, j);             /* x[i] と x[j]を交換 */
        i++;                       /* 次のデータ */
        j--;
    }

    if (left < i - 1)              /* 基準値の左に 2 以上要素があれば */
        QSort(x, left, i - 1);     /* 左の配列を Q ソートする */
    if (j + 1 <  right)            /* 基準値の右に 2 以上要素があれば */
        QSort(x, j + 1, right);    /* 右の配列を Q ソートする */
}

int main()
{
	long N,i , X_copy[100], X[100],max, mid;
	scanf("%ld",&N);
	for(i = 0;i<N;i++)
	{
		scanf("%ld",&X[i]);
		X_copy[i] = X[i];
	}
	
	QSort(X_copy,0,N-1);
	max = X_copy[N-1];
	i = 0;
	while(X_copy[i] < max/2 && i <= N-2) i++;
	if(i == N-1 && X_copy[N-2] < max/2)
	{
		printf("%ld %ld\n", X_copy[N-1],X_copy[N-2]);
	}
	else
	{
		mid = ((max/2 - X_copy[i]) <= (X_copy[i+1] - max/2))? X_copy[i]:X_copy[i+1];
	
		printf("%ld %ld\n", max, mid);
	}
	
	return 0;
}