#include<bits/stdc++.h> #define mms(a,n) memset(a,0,sizeof((a)[0])*(n)) #define mmp(a,b,n) memcpy(a,b,sizeof((b)[0])*(n)) #define lowbit(x) ((x)&-(x)) #define pb push_back #define fi first #define se second #define debug(...) fprintf(stderr,__VA_ARGS__) #define lowbit(x) ((x)&-(x)) #define fo(i,l,r) for(register int i=l,_lim_=r;i<=_lim_;i++) #define fd(i,r,l) for(register int i=r;_lim_=l;i>=_lim_;i--) using namespace std; typedef long long ll; typedef pair<int,int> pi; namespace io{ const int L=(1<<19)+1; char ibuf[L],*iS,*iT,obuf[L],*oS=obuf,*oT=obuf+L-1,c,st[55];int f,tp; inline char gc(){ if(iS==iT){ iT=(iS=ibuf)+fread(ibuf,1,L,stdin); return iS==iT?EOF:*iS++; } return*iS++; } inline void flush(){fwrite(obuf,1,oS-obuf,stdout);oS=obuf;} inline void putc(char x){*oS++=x;if(oS==oT)flush();} template<class I> inline void gi(I&x){ for(f=1,c=gc();c<'0'||c>'9';c=gc())if(c=='-')f=-1; for(x=0;c<='9'&&c>='0';c=gc())x=x*10+(c&15);x*=f; } template<class I> inline void print(I x){ if(!x)putc('0');if(x<0)putc('-'),x=-x; while(x)st[++tp]=x%10+'0',x/=10; while(tp)putc(st[tp--]); } inline void gs(char*s,int&l){ for(c=gc();c!='_'&&(c<'a'||c>'z');c=gc()); for(l=0;c=='_'||c<='z'&&c>='a';c=gc())s[l++]=c; } }; using io::putc; using io::gi; using io::gs; using io::print; const int N=200005,P=1e9+7; int n,a[N],lm[N],rm[N],ans,num; pi b[N]; void init(){ static int prefixMax[N],suffixMax[N],qu[N],ql,rk[N]; gi(n); for(int i=1;i<=n;i++)gi(a[i]),b[i]={a[i],i}; sort(b+1,b+n+1); for(int i=1;i<=n;i++)rk[b[i].se]=i; for(int i=1;i<=n;i++){ while(ql&&rk[qu[ql]]<=rk[i])qu[ql--]=0; lm[i]=qu[ql];qu[++ql]=i; } while(ql)qu[ql--]=0; for(int i=n;i>=1;i--){ while(ql&&rk[qu[ql]]<=rk[i])qu[ql--]=0; rm[i]=qu[ql];qu[++ql]=i; } for(int i=1;i<=n;i++)prefixMax[i]=max(prefixMax[i-1],rk[i]); for(int i=n;i>=1;i--)suffixMax[i]=max(suffixMax[i+1],rk[i]); for(int i=1;i<=n;i++){ if(!lm[i]){ int l=1,r=n,mid=(l+r+1)>>1; while(l<r){ if(suffixMax[mid]>=rk[i])l=mid;else r=mid-1; mid=(l+r+1)>>1; } lm[i]=mid; } if(!rm[i]){ int l=1,r=n,mid=(l+r)>>1; while(l<r){ if(prefixMax[mid]>=rk[i])r=mid;else l=mid+1; mid=(l+r)>>1; } rm[i]=mid; } } } inline int f1(int n){return (ll)n*(n+1)/2%P;} inline int f2(int n){return (ll)n*(n+1)%P*(2*n+1)%P*(P/6+1)%P;} inline int f12(int n){return (f1(n)+f2(n))%P;} inline bool check(int i,int l){ int p1,p2; if(lm[i]>i)p1=-max(n-lm[i]-(l-1)+1,0);else p1=lm[i]; if(rm[i]<i)p2=-max(rm[i]-(l+1),0);else p2=n-rm[i]+1;if(l==1)p1=max(p1,0); return max(max(i-l,0),p1)+max(max(n-(i+l-1),0),p2)<=n-l; } inline int bsearch(int i){ int l=1,r=n,mid=(l+r+1)>>1; while(l<r){ if(check(i,mid))l=mid;else r=mid-1; mid=(l+r+1)>>1; } return mid; } int main(){ init(); num=f1(f1(n)); for(int i=1;i<=n;i++)if(lm[i]!=i){ int lim=bsearch(i),w=0; w=(w+f12(n)-f12(n-lim))%P; if(lm[i]>i){ int t=min(lim,i-1); w=(w-f12(i-1)+f12(i-t-1))%P; }else{ int t=min(i-lm[i],lim),s=(ll)lm[i]*(lm[i]+1)%P; w=(w-f12(i-1)+f12(i-t-1)-(ll)s*(lim-t))%P; } if(rm[i]<i){ int t=min(n+1-i,lim); w=(w-f12(n-i)+f12(n-i-t))%P; }else{ int t=min(rm[i]-i,lim),s=(ll)(n-rm[i]+1)*(n-rm[i]+2)%P; w=(w-f12(n-i)+f12(n-i-t)-(ll)s*(lim-t))%P; } w=(ll)w*(P/2+1)%P; if(lm[i]>i){ int t=min(lim,n+2-lm[i]); w=(w+f2(n-1)-f2(n-t)-(ll)(lm[i]-1)*(f1(n-1)-f1(n-t)))%P; }else{ w=(w-(ll)(f1(n)-f1(n-lim))*lm[i])%P; } if(rm[i]<i){ int t=min(rm[i]-1,lim); w=(w+f2(n)-f2(n-t)-(ll)(n+2-rm[i])*(f1(n)-f1(n-t)))%P; }else{ w=(w-(ll)(f1(n)-f1(n-lim))*(n-rm[i]+1))%P; } int ri=lim; int k1,w1,k2,w2; if(lm[i]>i) k1=1,w1=lm[i]-n-2,ri=min(ri,n-lm[i]+2); else k1=0,w1=lm[i]; if(rm[i]<i) k2=1,w2=1-rm[i],ri=min(ri,rm[i]-1); else k2=0,w2=n-rm[i]+1; w=(w+k1*k2*(f2(ri)-f2(1))+(ll)(w2*k1+w1*k2)*(f1(ri)-f1(1))+(ll)w1*w2*(ri-1))%P; if(lm[i]<i){ if(rm[i]<i)w=(w+(ll)(2-rm[i])*lm[i])%P; else w=(w+(ll)(n-rm[i]+1)*lm[i])%P; } if(lm[i]<i){ int t=min(lim,i-lm[i]); w=(w+(ll)lm[i]*(f1(i-1)-f1(i-t-1))+(ll)(lim-t)*lm[i]%P*lm[i])%P; }else{ int t=min(lim,min(n-lm[i]+1,i-1)); k1=1,w1=-n-2+lm[i],k2=-1,w2=i,ri=t; w=(w+k1*k2*(f2(ri)-f2(1))+(ll)(w2*k1+w1*k2)*(f1(ri)-f1(1))+(ll)w1*w2*(ri-1))%P; } if(rm[i]>i){ int t=min(rm[i]-i,lim),p=n-rm[i]+1; w=(w+(ll)(f1(n-i)-f1(n-i-t))*p+(ll)(lim-t)*p%P*p)%P; }else{ int t=min(lim,min(n-i,rm[i]-2)); k1=1,w1=-rm[i]+1,k2=-1,w2=n-i+1,ri=t; w=(w+k1*k2*f2(ri)+(ll)(w2*k1+w1*k2)*f1(ri)+(ll)w1*w2*ri)%P; } if(w<0)w+=P; ans=(ans+(ll)a[i]*w)%P; num=(num-w+P)%P; } ans=(ans+(ll)b[n].fi*num)%P; printf("%d\n",ans); return 0; }