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