// q.c
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int M=1000000+10;
struct Data {
int x,y,z;
bool operator > (const Data &A) {
if(x!=A.x) return x>A.x;
if(y!=A.y) return y<A.y;
return z<A.z;
}
};
int n,a[M];
Data solve(int l,int r) {
if(l==r) return (Data){a[l],l,r};
int mid=(l+r)>>1,lsum=a[mid],rsum=a[mid+1];
Data lc=solve(l,mid);
Data rc=solve(mid+1,r);
Data lp={a[mid],mid,mid};
Data rp={a[mid+1],mid+1,mid+1};
for(int i=mid-1;i>=l;lsum+=a[i],i--)
if(lsum+a[i]>=lp.x) lp.x=lsum+a[i],lp.y=i;
for(int i=mid+2;i<=r;rsum+=a[i],i++)
if(rsum+a[i]>rp.x) rp.x=rsum+a[i],rp.z=i;
Data res={lp.x+rp.x,lp.y,rp.z};
if(lc>res) res=lc;
if(rc>res) res=rc;
return res;
}
int main() {
freopen("subq.in","r",stdin);
freopen("subq.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
Data ans=solve(1,n);
printf("%d\n%d\n%d\n",ans.y,ans.z,ans.x);
return 0;
}