1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<bits/stdc++.h> using namespace std;
typedef long long ll; int n; typedef pair<int,int> pii; const int N=1e6+5; pii a[N];
void getint(int &x){ char c=getchar(); for(;c>'9'||c<'0';c=getchar()); for(x=0;c>='0'&&c<='9';c=getchar()){ x=(x<<1)+(x<<3)+c-'0'; } } int bl[N],br[N],sl[N],sr[N]; pii st[N]; int tp=0;
int main(){ getint(n); for(int i=1;i<=n;++i){ getint(a[i].first); a[i].second=i; } for(int i=1;i<=n;++i){ while(tp&&st[tp]<a[i]){ st[tp--]=pii(0,0); } bl[i]=st[tp].second; st[++tp]=a[i]; } while(tp){ st[tp--]=pii(0,0); } for(int i=1;i<=n;++i){ while(tp&&st[tp]>a[i]){ st[tp--]=pii(0,0); } sl[i]=st[tp].second; st[++tp]=a[i]; } while(tp){ st[tp--]=pii(0,0); } st[0].second=n+1; for(int i=n;i>0;--i){ while(tp&&st[tp]<a[i]){ st[tp--]=pii(0,0); } br[i]=st[tp].second; st[++tp]=a[i]; } while(tp){ st[tp--]=pii(0,0); } for(int i=n;i>0;--i){ while(tp&&st[tp]>a[i]){ st[tp--]=pii(0,0); } sr[i]=st[tp].second; st[++tp]=a[i]; } while(tp){ st[tp--]=pii(0,0); }
ll ans=0; for(int i=1;i<=n;++i){ ans+=(ll)((ll)(br[i]-i)*(i-bl[i])-(ll)(sr[i]-i)*(i-sl[i]))*a[i].first; } printf("%lld",ans); return 0; }
|