/*
这是我开始的做法,两层循环,
其实存在思路不够好,存在大量冗余,导致时间超了
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 125
int n;
int sum[N];
int f[N],a[N],d[N],r[N];
int main()
{
while (~scanf("%d",&n))
{
int i,j,t,k;
for (i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
f[n]=a[n];
d[n]=n;
r[n]=0;
for (i=n-1;i>0;--i)
{
for (j=i;j<=n;++j)
if (f[i]<a[j]+r[j+1])
{
f[i]=a[j]+r[j+1];
d[i]=j;
}
k=i;
t=0;
while (k<=n)
{
t+=sum[d[k]-1]-sum[k-1];
k=d[k]+1;
}
r[i]=sum[n]-sum[i-1]-t-f[i];
}
printf("%d %d %d \n",f[1],r[1],t);
memset(sum,0,sizeof(sum));
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
memset(r,0,sizeof(r));
}
return 0;
}
*/
/*
正解应该是dp,类似于最大子串和, 实现时通过降维可以不用数组
两个数组f[i],g[i],分别表示笨蛋和傻子从第i小时开始的最大工资
f[i]=max(g[i-1]+a[i],f[i-1])
如果f[i]= g[i-1]+a[i],则g[i]=f[i-1]
显然可以降维,不用数组,用两个变量即可。
*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 125
int n,sum;
int a[N];
int main()
{
while (~scanf("%d",&n))
{
int i,j,t,k;
sum=0;
for (i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum=sum+a[i];
}
int max1=0,max2=0,tmp;
for (i=n;i>0;--i)
if (a[i]+max2>=max1)
{
tmp=max1;
max1=a[i]+max2;
max2=tmp;
}
printf("%d %d %d\n",max1,max2,sum-max1-max2);
}
return 0;
}