#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;
}