import sys

IS = lambda: sys.stdin.readline().rstrip()

II = lambda: int(IS())

MII = lambda: list(map(int, IS().split()))

import numpy as np

def getNearestValue(list, num):

    """

    概要: リストからある値に最も近い値を返却する関数

    @param list: データ配列

    @param num: 対象値

    @return 対象値に最も近い値

    """

    # リスト要素と対象値の差分を計算し最小値のインデックスを取得

    idx = np.abs(np.asarray(list) - num).argmin()

    return list[idx]



def main():

    n = II()

    aa = MII()

    if n == 2: print(*aa); exit(0)

    aa.sort()

    maxa = aa[-1]

    m = maxa/2

    a = getNearestValue(aa, m)

    print(maxa, a, end= ' ')



if __name__ == '__main__':

    main()

import sys

IS = lambda: sys.stdin.readline().rstrip()

II = lambda: int(IS())

MII = lambda: list(map(int, IS().split()))

from bisect import bisect_left



def main():

    n = II()

    aa = MII()

    if n == 2: print(*aa); exit(0)

    aa.sort()

    ans_n = aa[-1]

    m = ans_n/2

    idx = bisect_left(aa, m+1)

    ans_r = aa[idx] if idx!=n-1 else aa[idx-1]

    if abs(aa[idx]-m) > abs(aa[idx-1]-m):

        ans_r = aa[idx-1]

    print(ans_n, ans_r, end= ' ')



if __name__ == '__main__':

    main()

import sys

IS = lambda: sys.stdin.readline().rstrip()
II = lambda: int(IS())
MII = lambda: list(map(int, IS().split()))
import numpy as np


def getNearestValue(list, num):
    """
    概要: リストからある値に最も近い値を返却する関数
    @param list: データ配列
    @param num: 対象値
    @return 対象値に最も近い値
    """
    # リスト要素と対象値の差分を計算し最小値のインデックスを取得
    idx = np.abs(np.asarray(list) - num).argmin()
    return list[idx]


def main():
    n = II()
    aa = MII()
    if n == 2:
        print(*aa)
        exit(0)
    aa.sort()
    maxa = aa[-1]
    m = maxa / 2
    a = getNearestValue(aa, m)
    print(maxa, a, end=" ")


if __name__ == "__main__":
    main()

import sys

IS = lambda: sys.stdin.readline().rstrip()
II = lambda: int(IS())
MII = lambda: list(map(int, IS().split()))
from bisect import bisect_left


def main():
    n = II()
    aa = MII()
    if n == 2:
        print(*aa)
        exit(0)
    aa.sort()
    ans_n = aa[-1]
    m = ans_n / 2
    idx = bisect_left(aa, m + 1)
    ans_r = aa[idx] if idx != n - 1 else aa[idx - 1]
    if abs(aa[idx] - m) > abs(aa[idx - 1] - m):
        ans_r = aa[idx - 1]
    print(ans_n, ans_r, end=" ")


if __name__ == "__main__":
    main()

-import numpy as np - - -def getNearestValue(list, num): -    """ -    概要: リストからある値に最も近い値を返却する関数 -    @param list: データ配列 -    @param num: 対象値 -    @return 対象値に最も近い値 -    """ -    # リスト要素と対象値の差分を計算し最小値のインデックスを取得 -    idx = np.abs(np.asarray(list) - num).argmin() -    return list[idx] +from bisect import bisect_left -    maxa = aa[-1] -    m = maxa / 2 -    a = getNearestValue(aa, m) -    print(maxa, a, end=" ") +    ans_n = aa[-1] +    m = ans_n / 2 +    idx = bisect_left(aa, m + 1) +    ans_r = aa[idx] if idx != n - 1 else aa[idx - 1] +    if abs(aa[idx] - m) > abs(aa[idx - 1] - m): +        ans_r = aa[idx - 1] +    print(ans_n, ans_r, end=" ")