import std.stdio, std.string, std.range, std.conv, std.array, std.algorithm, std.math, std.typecons, std.bigint;

void main() {
    /*
    nCr = n!/(n-r)!/r!
    nC(r+1) = n!/(n-r-1)!/(r+1)!

    nC(r+1) / nCr = (n-r)!r! / { (n-r-1)!(r+1)!}
                  = (n-r) / (r+1) > 1 のときはrを増加

                    n-r > r+1
                    n > 2r + 1
                    r < (n-1)/2　のときはrを増やしても良い

                    nが奇数のとき、r = (n-1)/2 は整数だから、rとr+1で最大値を取る
                    nが偶数のとき、r = (n-1)/2は小数だから、r-1/2までは増加する。
                    したがって、最大値はr+1/2
     */


    auto N = readln.chomp.to!int;
    auto a = readln.split.to!(int[]);

    auto n = a.reduce!((a,b) => a > b ? a : b);

    auto top = (n-1)*.5;

    auto lower = a.filter!(x => x != n).filter!(x => x <= top);
    auto upper = a.filter!(x => x != n).filter!(x => x > top);

    if (lower.empty) {
        writefln("%d %d", n, upper.reduce!((a,b) => a < b ? a : b));
    } else if (upper.empty) {
        writefln("%d %d", n, lower.reduce!((a,b) => a > b ? a : b));
    } else {
        auto r1 = lower.reduce!((a,b) => a > b ? a : b);
        auto r2 = upper.reduce!((a,b) => a < b ? a : b);

        /*
           nCa > nCb
           (n-a)!a! < (n-b)!b!

           a < bは既知なので、n-a>n-b

           (n-a)!/(n-b)! < b!/a!

           (n-a)*...*(n-b+1) < b*..(a+1)

           これらの個数は等しいので、各々比べれば良い

           n < a + b
           */

        if (n < r1+r2) {
        //if (combi(BigInt(n), BigInt(r1)) > combi(BigInt(n), BigInt(r2))) {
            writefln("%d %d", n, r1);
        } else {
            writefln("%d %d", n, r2);
        }
    }
}

