提交时间:2024-10-16 12:54:29

运行 ID: 33606

#include<bits/stdc++.h> #define ull unsigned long long #define PII pair<int,int> #define mk make_pair #define fi first #define se second using namespace std; const int N=2e6+10; const int INF=1e9+10; struct nd{ int id;ull vl,tmp; nd(){} nd(int x,ull y,ull z){ id=x,vl=y,tmp=z; } }; stack<nd> q; int n;ull a[N],v[N]; int lp[N],rp[N]; //int A[N][200]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%llu",&a[i]); q.push(nd(0,0,0)); for(int i=1;i<=n;i++){ ull val=a[i]; while(!q.empty()){ if(q.top().vl>a[i]){ val=max(val,q.top().tmp);q.pop(); }else{ lp[i]=q.top().id+1;break; } }q.push(nd(i,a[i],val));v[i]=max(v[i],val); }while(!q.empty()) q.pop(); q.push(nd(n+1,0,0)); for(int i=n;i>=1;i--){ ull val=a[i]; while(!q.empty()){ if(q.top().vl>a[i]){ val=max(val,q.top().tmp);q.pop(); }else{ rp[i]=q.top().id-1;break; } }q.push(nd(i,a[i],val));v[i]=max(v[i],val); }ull ans=0; for(int i=1;i<=n;i++){ ans=max(ans,v[i]*(rp[i]-lp[i]+1)*a[i]); } printf("%llu",ans); return 0; }