#include <bits/stdc++.h>

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