#include using namespace std; const int maxn = 2e5 + 50; const int mod = 1e9 + 7; const int inv2 = ( mod + 1 ) >> 1; const int maxsz = 1e6 + 50; #define lowbit( x ) ( ( x ) & ( - x ) ) int n , A[maxn] , Val[maxn] , ID[maxn] , lft[maxn] , rht[maxn] , tree1[maxsz] , tree2[maxsz] , tree3[maxsz] , tree4[maxsz] , D[maxn] , E[maxn] , pf[maxn]; inline void ins( int & x , int y ){ if( ( x += y ) >= mod ) x -= mod; } void Update( int x , int y , int * tree ){ while( x < maxsz ){ ins( tree[x] , y ); x += lowbit( x ); } } int Prefix( int x , int * tree ){ int ret = 0; while( x ){ ins( ret , tree[x] ); x -= lowbit( x ); } return ret; } void Init(){ for(int i = 1 ; i <= n ; ++ i) Val[i] = i; sort( Val + 1 , Val + n + 1 , [ & ]( const int & x , const int & y ){ return A[x] < A[y] || ( A[x] == A[y] && x < y ); }); for(int i = 1 ; i <= n ; ++ i) ID[Val[i]] = i , Val[i] = A[Val[i]]; } int Solve1(){ for(int i = 1 ; i <= n ; ++ i) lft[i] = 0 , rht[i] = n + 1; stack < int > stk; for(int i = n ; i >= 1 ; -- i){ while( !stk.empty() && ID[i] > ID[stk.top()] ) stk.pop(); if( !stk.empty() ) rht[i] = stk.top(); stk.push( i ); } while( !stk.empty() ) stk.pop(); for(int i = 1 ; i <= n ; ++ i){ while( !stk.empty() && ID[i] > ID[stk.top()] ) stk.pop(); if( !stk.empty() ) lft[i] = stk.top(); stk.push( i ); } int ans = 0; for(int i = 1 ; i <= n ; ++ i){ int l = lft[i] + 1 , r = rht[i] - 1; ins( ans , 1ll * (i + r) * (r - i + 1) % mod * inv2 % mod * (i - l + 1) % mod * Val[ID[i]] % mod ); ins( ans , 1ll * ( ( - ( 1ll * ( l + i ) * (i - l + 1) / 2 ) + i - l + 1 ) % mod + mod ) % mod * (r - i + 1) % mod * Val[ID[i]] % mod ); } return ans; } int Solve2(){ int ans = 0 , sum = 0; for(int i = 1 , j = 0 ; i <= n ; ++ i){ j = max( j , A[i] ); D[i] = j; Update( j , 1 , tree1 ); Update( j , j , tree3 ); } for(int i = n , j = 0 ; i >= 1 ; -- i){ j = max( j , A[i] ); E[n + 1 - i] = j; Update( j , 1 , tree2 ); Update( j , j , tree4 ); } for(int i = 1 ; i < maxsz ; ++ i){ int t = 1ll * Prefix( i , tree1 ) * Prefix( i , tree2 ) % mod; ins( t , mod - 1ll * Prefix( i - 1 , tree1 ) * Prefix( i - 1 , tree2 ) % mod ); ins( sum , 1ll * t * i % mod ); } for(int i = 1 ; i < n ; ++ i){ Update( D[i] , mod - 1 , tree1 ); Update( D[i] , mod - D[i] , tree3 ); ins( sum , mod - 1ll * D[i] * Prefix( D[i] , tree2 ) % mod ); ins( sum , ( Prefix( D[i] , tree4 ) - Prefix( maxsz - 1 , tree4 ) + mod ) % mod ); //cout << "i is " << i << " sum is " << sum << endl; ins( ans , sum ); ins( sum , mod - 1ll * E[i] * Prefix( E[i] , tree1 ) % mod ); ins( sum , ( Prefix( E[i] , tree3 ) - Prefix( maxsz - 1 , tree3 ) + mod ) % mod ); Update( E[i] , mod - 1 , tree2 ); Update( E[i] , mod - E[i] , tree4 ); } return ans; } int main( int argc , char * argv[] ){ scanf( "%d" , & n ); int maxa = 0; for(int i = 1 ; i <= n ; ++ i){ scanf( "%d" , A + i ); maxa = max( maxa , A[i] ); } Init(); int ans = 0; ins( ans , Solve1() ); ins( ans , Solve2() ); for(int i = 1 ; i <= n ; ++ i){ pf[i] = pf[i - 1]; ins( pf[i] , n + 1 - i ); } for(int i = 1 ; i + 2 <= n ; ++ i){ int z = ( pf[n] - pf[i + 1] + mod ) % mod; ins( ans , 1ll * z * (n + 1 - i) % mod * maxa % mod ); } printf( "%d\n" , ans ); return 0; }