#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head

const int N=201000;
ll c[N*2][4],s1[N*2],s2[N*2];
int n,a[N],emp[N],f[N],sz[N];
vector<PII> v;
int find(int x) { return f[x]==x?x:f[x]=find(f[x]); }
ll res,cal,sm;
ll gao(ll u,ll v) {
	ll ret=c[u+1][2];
	u-=1;
	if (u>v) swap(u,v);
	ret+=s1[u+v+1]-s1[v-u+1];
	ret+=s2[v-u+1];
	return ret%mod;
}
int main() {
	scanf("%d",&n);
	rep(i,1,n+1) scanf("%d",a+i),v.pb(mp(a[i],i));
	sort(all(v));
	rep(i,1,2*n+10) {
		c[i][0]=1;
		c[i][1]=i;
		c[i][2]=(ll)i*(i-1)/2%mod;
		c[i][3]=(ll)i*(i-1)*(i-2)/6%mod;
		s2[i]=(s2[i-1]+c[i][2])%mod;
		s1[i]=c[i][2];
		if (i>=2) s1[i]=(s1[i]+s1[i-2])%mod;
	}
	rep(i,1,n+1) f[i]=i;
	ll pre=0;
	rep(i,0,n-1) {
		int id=v[i].se;
		emp[id]=1;
		sz[id]=1;
		if (emp[id-1]) {
			int u=find(id-1);
			cal-=c[sz[u]+2][3];
			f[u]=id;
			sz[id]+=sz[u];
		}
		if (emp[id+1]) {
			int u=find(id+1);
			cal-=c[sz[u]+2][3];
			f[u]=id;
			sz[id]+=sz[u];
		}
		cal+=c[sz[id]+2][3];
		res=cal;
		if (emp[1]&&emp[n]) {
			int ls=sz[find(1)],rs=sz[find(n)];
			res-=c[ls+2][3]+c[rs+2][3];
			res+=gao(ls,rs);
		}
		res=res%mod;
		sm=(sm+(res-pre)*v[i].fi)%mod;
		pre=res;
	}
	res=(ll)n*(n+1)/2%mod;
	res=res*(res+1)/2%mod;
	sm=(sm+(res-pre)*v[n-1].fi)%mod;
	if (sm<0) sm+=mod;
	printf("%lld\n",sm);
}