#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define all(x) x.begin() , x.end() #define fi first #define se second #define pb push_back #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define For( i , a ) for(int i=1;i<=a;i++) #define ort (b+s)/2 #define y2 asrwjaelkf #define y1 asseopirwjaelkf #define set multiset using namespace std; inline int read() { int res = 0 ;int neg ; while(true){char ch = getchar();if(ch>='0' && ch<='9' || ch=='-'){if(ch=='-') neg = -1;else neg = 1 , res = ch-'0';break;} } while(true){char ch = getchar();if(ch>='0' && ch<='9') res*=10 , res+=ch-'0';else break;} return res*neg; } typedef long long Lint; typedef double db; typedef pair ii; typedef pair id; typedef pair dii; typedef pair iii; typedef pair i4; const int maxn = 201020; const int maxm = 10000020; const int MOd = 1e9+7; const int K = 300; int mul( int a, int b ) { return (Lint)a*b%MOd; } int add( int a, int b ) { a+=b; a %= MOd; if( a < 0 ) return a+MOd; return a; } int us( int x, int y ) { int z = 1; while( y ) { if( y&1 ) z = mul( x, z ); x = mul( x, x ); y >>= 1; } return z; } int rev( int n ) { return us( n, MOd-2 ); } int f( int n ) { return mul( mul( n, n-1 ), rev(2) ); } int n2( int n ) { return mul( n, mul( n+1, mul( n+n+1, rev( 6 ) ) ) ); } int g( int n ) { return add( mul( n, mul( n+1, mul( n+n+1, rev( 12 ) ) ) ), -mul( mul( n, n+1 ), rev(4) ) ); } int used[maxn], L[maxn], R[maxn], dad[maxn]; int findl( int n ) { if( L[n] == n ) return n; return L[n] = findl( L[n] ); } int findr( int n ) { if( R[n] == n ) return n; return R[n] = findr( R[n] ); } int find( int n ) { if( dad[n] == n ) return n; return dad[n] = find( dad[n] ); } int c( int x, int y ) { if( x > y ) swap( x, y ); return add( mul( y-x, f( x+1 ) ), n2( x ) ); } int a; ii ar[maxn]; int main() { //freopen("asd.in","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&a); for(int i=1;i<=a;i++) scanf("%d",&ar[i].fi), ar[i].se = i; sort( ar+1, ar+1+a ); for(int i=1;i<=a;i++) L[i] = R[i] = i, dad[i] = i; int ans = 0; int tot = f( f( a+1 )+1 ); for(int i=1;i y ) swap( x, y ); int h = mul( mul( x, x-1 ), rev(2) ); int m = mul( x, y ); //printf("x=%d y=%d %d %d %d\n",x,y,n2(x),f(x),g( x )); int sum = 0; sum = add( sum, add( mul( m, x ), -g( x ) ) ); sum = add( sum, add( mul( add( m, -h ), y-x ), -mul( x, f( y-x+1 ) ) ) ); sum = add( sum, add( n2(s-y), -g(s-y) ) ); //printf("asd %d\n",sum); if( R[t] == a || L[t] == 1 ) { int d=0; if( R[t] == a && used[1] ) { d = R[find( 1 )]; x = R[t] - t + 1; y = t - L[t] + 1; } else if( L[t] == 1 && used[a] ) { d = a-L[find(a)]+1; x = t - L[t] + 1; y = R[t] - t + 1; } //printf("asd ----- %d\n",d); if( d ) { if( L[t] == 1 ) d++, sum = add( sum, -mul( d, y ) ); else d--; int go = min( x, d ); sum = add( sum, mul( y, add( f( d+1 ), -f( d-go+1 ) ) ) ); d -= go; sum = add( sum, c( y-1, d ) ); } } // printf("%d --> sum = %d\n",ar[i].fi,sum); tot = add( tot, -sum ); ans = add( ans, mul( sum, ar[i].fi ) ); //return 0; } ans = add( ans, mul( tot, ar[a].fi ) ); cout << ans << endl; return 0; }