解析:
用单调栈维护当前方块可以往左右扩展的长度。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10000;
typedef long long ll;
int l[N],r[N],h[N],q[N];
int n;
int main()
{
while(cin>>n,n)
{
for(int i=1;i<=n;i++) cin>>h[i];
h[0]=h[n+1]=-1;
int tt=0;
q[0]=0;
for(int i=1;i<=n;i++)
{
while(h[q[tt]]>=h[i]) tt--;
l[i]=i-q[tt];
q[++tt]=i;
}
memset(q,0,sizeof q);
tt=0;
q[0]=n+1;
for(int i=n;i>=1;i--)
{
while(h[q[tt]]>=h[i]) tt--;
r[i]=q[tt]-i;
q[++tt]=i;
}
ll res=0;
for(int i=1;i<=n;i++) res=max(res,h[i]*(l[i]+r[i]-1ll));
cout<<res<<endl;
}
}