#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

const int maxN = 200000 + 10;
const int MOD = int(1e9+7);

int n, A[maxN];
int L[maxN], R[maxN], sumsq[maxN];
int X[maxN];

// SUM(Smax(len_i)*i)
int solve1() {
    sumsq[0] = 0;
    for (int i = 1; i <= n; i++) {
        sumsq[i] = (sumsq[i-1] + 1LL*i*i) % MOD;
    }
    R[n] = n;
    for (int i = n-1; i >= 1; i--) {
        R[i] = i;
        while (R[i] < n && A[i] > A[R[i]+1]) {
            R[i] = R[R[i]+1];
        }
    }
    int res = 0;
    for (int i = 1; i <= n; i++) {
        L[i] = i;
        if (i > 1) {
            while (L[i] > 1 && A[i] >= A[L[i]-1]) {
                L[i] = L[L[i]-1];
            }
        }
        int ll = i - L[i] + 1, rr = R[i] - i + 1;
        int mm = min(ll, rr), xx = max(ll, rr), xm;
        // size 1->mm (num 1->mm)
        res = (res + 1LL*A[i]*sumsq[mm]) % MOD;
        // size mm+1->xx (num mm)
        xm = 1LL*mm*(mm+1+xx)*(xx-mm)/2 % MOD;
        res = (res + 1LL*A[i]*xm) % MOD;
        // size xx+1->xx+mm-1 (num mm->1)
        // i*(xx+mm-i) = i*(xx+mm)-i*i
        xm = 1LL*(xx+mm)*(mm-1)*mm/2 % MOD;
        res = (res + 1LL*A[i]*(0LL+MOD+xm-sumsq[mm-1])) % MOD;
    }
    return res;
}

int solve3() {
    int res = 0, ix;
    // R->L
    X[n] = X[n+1] = 0;
    for (int j = n-1; j >= 1; j--)
        X[j] = (X[j+1] + L[j+1]) % MOD;
    ix = 0;
    for (int i = 1; i <= n; i++) {
        while (ix + 1 < n && R[n-i+1] >= L[ix+2]) {
            ix++;
        }
        res = (res + (1LL*R[n-i+1]*i)%MOD*max(ix-i+1, 0)) % MOD;
        res = (res + 1LL*i*X[max(ix+1, i)]) % MOD;
    }
    // L->R
    // 321 <-> 321--333 <-> 
    X[n+1] = 0;
    for (int i = n; i >= 1; i--)
        X[i] = (X[i+1] + R[n-i+1]) % MOD;
    ix = 0;
    for (int j = 1; j < n; j++) {
        while (ix + 1 <= n && L[j+1] >= R[n-ix]) {
            ix++;
        }
        res = (res + (1LL*L[j+1]*j)%MOD*max(ix-j, 0)) % MOD;
        res = (res + 1LL*j*X[max(ix+1, j+1)]) % MOD;
    }
    // BF
    int R2 = 0;
    // for (int j = 1; j < n; j++)
    //     for (int i = 1; i <= n; i++) {
    //         R2 = (R2 + 1LL*max(R[n-i+1], L[j+1])*min(i, j)) % MOD;
    //     }
    // printf("%d vs %d\n", res, R2);
    return (res + R2) % MOD;
}

void solve() {
    int res = 0;
    // SUM(Si*i)
    res = solve1();
    //
    L[0] = R[n+1] = 0;
    for (int i = 1; i <= n; i++) {
        L[i] = max(L[i-1], A[i]);
    }
    for (int i = n; i >= 1; i--) {
        R[i] = max(R[i+1], A[i]);
    }
    // SUM(n*(n-1)*(n-2)/2)*MAX
    int neo = L[n];
    for (int i = n; i >= 2; i--) {
        res = (res + 1LL*i*(i-1)*(i-2)/2%MOD*neo) % MOD;
    }
    // SUM(RL(n-i,j)*(i+1)*(j-1))
    res = (res + solve3()) % MOD;
    printf("%d\n", res);
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &A[i]);
    solve();
    return 0;
}