#include #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 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 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 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=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=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]>1; while(l>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(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) k1=1,w1=lm[i]-n-2,ri=min(ri,n-lm[i]+2); else k1=0,w1=lm[i]; 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; }