#include<fstream>
#include<iostream>
using namespace std;
typedef struct {long nrcif; short cif[505];} numarmare;
long i,n,T[1005];
numarmare mx,mn;
	ifstream in("cos.in");
	ofstream ut("cos.out");
void afisare()
{
	long i;
	for(i=mx.nrcif-1;i>=0; --i)
		ut<<mx.cif[i];
	ut<<"\n";
	for(i=mn.nrcif-1;i>=0; --i)
		ut<<mn.cif[i];
	ut<<"\n";
}
void adunare( numarmare &x, long nr)
{
	long i=0;
	while(nr)
	{
		x.cif[i]+=nr%10;
		nr/=10;
		i++;
	}
	x.nrcif=max(x.nrcif,i);
	for(i=0; i<x.nrcif; ++i)
	{
		if(x.cif[i]>9)
		{
			x.cif[i]-=10;
			x.cif[i+1]++;
		}
	}
	if(x.cif[x.nrcif])
		x.nrcif++;
}
void mins()
{
	mn.cif[0]--;
	long i=0;
	while(mn.cif[i]==-1)
	{
		mn.cif[i]+=10;
		mn.cif[i+1]--;
		i++;
	}
	if(mn.cif[mn.nrcif-1]==0)
	{
		mn.cif[mn.nrcif-1]=0;
		mn.nrcif--;
	}
}
void doi( numarmare &x)
{
	long i=0;
	for(i=x.nrcif-1; i>=0; --i)
	{
		x.cif[i]*=2;
		if(x.cif[i]>9)
		{
			x.cif[i]-=10;
			x.cif[i+1]++;
		}
	}
	if(x.cif[x.nrcif])
	{
		x.nrcif++;
	}
}
void maxim (long ind )
{
	adunare(mx,T[ind]);
	doi(mx);
	adunare(mx,+1);
}
void minim(long ind )
{
	if(T[ind]==0 && mn.nrcif==1 && mn.cif[0]==0)
	{
		;
	}
	else{
		adunare(mn,T[ind]);
		doi(mn);
		mins();
	}
}

int main()
{
	/* teste
	adunare(mn,1000);
	cout<<mn.nrcif<<endl;
	mins();
	afisare(); */
		
	/* teste
		
		adunare(mx,100);
		adunare(mx,899);
		adunare(mx,1);
		adunare(mx,7);
		doi(mx);
		adunare(mn,999);
		doi(mn);
		adunare(mn,2);
		doi(mn);
		afisare();*/
	in>>n;
	for(i=1; i<=n; ++i)
	{
		in>>T[i];
	}
	mx.nrcif=1;
	mn.nrcif=1;
	for(i=n; i>=1; --i)
	{
		maxim(i);
		minim(i);
	}
	afisare();
	in.close();
	ut.close();
	return 0;
}
