单调栈经典题目
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int le[maxn],stack[maxn],top,l,r,n,a[maxn];
ll sum[maxn],t,ans;
int main()
{
while(scanf("%d",&n)!=EOF){
ans=-1;
memset(sum,0,sizeof(sum));
top=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
a[++n]=-1;
for(int i=1;i<=n;i++)
{
if(top==0||a[i]>a[stack[top-1]])
{
le[i]=i;
stack[top++]=i;
continue;
}
if(a[i]==a[stack[top-1]])
continue;
while(top>=1&&a[i]<a[stack[top-1]])
{
top--;
t=1LL*a[stack[top]]*(sum[i-1]-sum[le[stack[top]]-1]);
if(t>ans)
{
ans=t;
l=le[stack[top]];
r=i-1;
}
}
le[i]=le[stack[top]];
stack[top++]=i;
}
printf("%lld\n%d %d\n",ans,l,r);
}
return 0;
}