#ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> #include <unordered_set> #include <unordered_map> using namespace std; typedef long long int64; typedef unsigned long long uint64; #define two(X) (1<<(X)) #define twoL(X) (((int64)(1))<<(X)) #define contain(S,X) (((S)&two(X))!=0) #define containL(S,X) (((S)&twoL(X))!=0) const double pi=acos(-1.0); const double eps=1e-11; template<class T> inline void ckmin(T &a,T b){if(b<a) a=b;} template<class T> inline void ckmax(T &a,T b){if(b>a) a=b;} template<class T> inline T sqr(T x){return x*x;} typedef pair<int,int> ipair; #define SIZE(A) ((int)A.size()) #define LENGTH(A) ((int)A.length()) #define MP(A,B) make_pair(A,B) #define PB(X) push_back(X) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,a) for(int i=0;i<(a);++i) #define ALL(A) A.begin(),A.end() const int maxn=(2<<20); const int MOD=1000000007; #define MUL(a,b) ((int)((int64)(a)*(b)%(MOD))) inline int ADD(int a,int b) { a+=b; if (a>=MOD) a-=MOD; return a; } inline int SUB(int a,int b) { a-=b; if (a<0) a+=MOD; return a; } inline void ADDTO(int& a,int b) { a+=b; if (a>=MOD) a-=MOD; } inline void SUBTO(int& a,int b) { a-=b; if (a<0) a+=MOD; } const int INV_2=(MOD+1)/2; int n; int a[maxn]; int p[maxn]; int c2[maxn]; int sc2[maxn]; int sc3[maxn]; int b[maxn]; int father[maxn]; int cnt[maxn]; void prepare() { REP(i,maxn) c2[i]=MUL(MUL(i,i-1),INV_2); sc2[0]=c2[0]; FOR(i,1,maxn) sc2[i]=ADD(sc2[i-1],c2[i]); sc3[0]=c2[0]; sc3[1]=c2[1]; FOR(i,2,maxn) sc3[i]=ADD(sc3[i-2],c2[i]); } int get_father(int p) { int r=p; for (;father[r]>=0;r=father[r]); for (int t=father[p];t>=0;t=father[p]) father[p]=r,p=t; return r; } int eval(int p) { if (p==0 || p+cnt[p]-1==n-1) return 0; return sc2[cnt[p]+1]; } int eval0() { int l1=(b[0]?cnt[get_father(0)]:0); int l2=(b[n-1]?cnt[get_father(n-1)]:0); int r=c2[l1+1]; int m=min(l2,l1-1); if (m>=1) { int m2=l1+l2; int m1=l1+l2+2-m*2; ADDTO(r,sc3[m2]); if (m1-2>=0) SUBTO(r,sc3[m1-2]); } /* for (int k=1;k<=m;k++) { int e=l2-k+1+l1-k+1; ADDTO(r,c2[e]); } */ m=max(1,m+1); if (m<n && m<=l2) ADDTO(r,sc2[l2-m+2]); else if (m<n && m<=l1-1) ADDTO(r,sc2[l1-m+1]); /* for (int k=max(1,m+1);k<n;k++) { int e=0; if (k<=l2) e+=l2-k+1; if (k<=l1-1) e+=l1-k; ADDTO(r,c2[e+1]); } */ return r; } int merge_f(int a,int b) { a=get_father(a); b=get_father(b); if (a>b) swap(a,b); int r1=ADD(eval(a),eval(b)); father[b]=a; cnt[a]+=cnt[b]; int r2=eval(a); return SUB(r2,r1); } vector<int> ss(vector<int> a) { vector<int> r; int n=SIZE(a); FOR(i,1,n+1) REP(j,n-i+1) { int c=a[j]; FOR(k,j,j+i) ckmax(c,a[k]); r.push_back(c); } return r; } int main() { #ifdef _MSC_VER freopen("input.txt","r",stdin); #endif std::ios::sync_with_stdio(false); prepare(); cin>>n; REP(i,n) cin>>a[i]; /* n=10; REP(i,n) a[i]=rand()%5; REP(i,n) printf("%d ",a[i]); printf("\n"); int ret2=0; vector<int> bb=ss(ss(vector<int>(a,a+n))); for (int p:bb) ret2+=p; printf("%d\n",ret2); */ REP(i,n) p[i]=i; sort(p,p+n,[](int x,int y) { return a[x]<a[y]; }); REP(i,n) b[i]=0,father[i]=-1,cnt[i]=1; int ret=0,total=0; REP(at,n-1) { int k=p[at]; int delta=0; SUBTO(delta,eval0()); b[k]=1; ADDTO(delta,eval(k)); if (k-1>=0 && b[k-1]) ADDTO(delta,merge_f(k,k-1)); if (k+1<n && b[k+1]) ADDTO(delta,merge_f(k,k+1)); ADDTO(delta,eval0()); ADDTO(ret,MUL(delta,a[k])); ADDTO(total,delta); } total=SUB(MUL(MUL(c2[n+1],c2[n+1]+1),INV_2),total); ADDTO(ret,MUL(total,a[p[n-1]])); printf("%d\n",ret); return 0; }