/***************
Problem from :
Problem describe :
以某个点为最小值 向该点左右延伸, 保证延伸的区间中 该点依旧为最小值
data:
****************/
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#include<ctime>
#include<cstring>
#include<vector>
#include<string>
#define ll __int64
#define inf 0x3f3f3f3f3f
using namespace std;
const int N=100005;
__int64 sum[N], a[N];
int main()
{
int i, j, k, m, n;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
scanf("%I64d", &a[i]);
sum[i] = sum[i-1] + a[i];//前缀和
}
__int64 MAX=-1;
for(i=1; i<=n; i++)//循环枚举每个点
{
int l=i-1, r=i;
int t=a[i];
while(l>=1 && a[l]>=a[i]) l--;//向左延伸
for(j=i+1; j<=n; j++)//向右延伸
{
//与枚举的点相等的时候 将枚举指针 i 向后移动, 避免同一个值重复多次为最小值
while(a[j]==a[i])
{
r=j;
i++;
j++;
}
if(a[j]>=a[i]) r=j;
else break;
}
__int64 s=(sum[r]-sum[l])*t;//根据已经确定的左指针以及右指针计算出和
if(s>MAX) MAX=s;
}
printf("%I64d\n", MAX);
return 0;
}