#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <climits>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <cassert>
#include <vector>
#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<int,int> ii;
typedef pair<int,db> id;
typedef pair<db,ii> dii;
typedef pair<int,ii> iii;
typedef pair<ii,ii> 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<a;i++) {
        int t = ar[i].se;
        if( used[t-1] ) {
            L[t] = L[find(t-1)];
            dad[find(t-1)] = t;
        }
        if( used[t+1] ) {
            R[t] = R[find(t+1)];
            dad[find(t+1)] = t;
        }
        used[t] = 1;
        int x = t-L[t]+1;
        int y = R[t]-t+1;
        int s = x+y-1;
        if( x > 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;
}