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

const int maxn = 200010;
const int modulo = 1000000007;

int n;
LL a[maxn], l[maxn], r[maxn], c[maxn], s[maxn], fl[maxn], fr[maxn];
stack<pair<int, int>> st;

LL solve1(){
    LL re = 0, last = 0, tg = 0;
    st.push({modulo, 0});
    for (int i = 1; i <= n; i++){
        while (a[i] >= st.top().first){
            pair<int, int> tmp = st.top();
            st.pop();
            last = (last + modulo - (LL) tmp.first * (tmp.second - st.top().second)) % modulo;
            tg = (tg + (a[i] - tmp.first) * (s[i - st.top().second - 1] - s[i - tmp.second - 1])) % modulo;
        }
        last = (last + a[i] * (i - st.top().second)) % modulo;
        st.push({a[i], i});
        tg += last;
        re += tg;
    }
    return re;
}

LL solve2(){
    LL re = 0, sl = 0, sr = 0;
    for (int i = 1; i <= n; i++){
        fr[i] = max(fr[i - 1], a[i]);
        sr += fr[i];
    }
    for (int i = n; i >= 1; i--){
        fl[i] = max(fl[i + 1], a[i]);
        sl += fl[i];
    }
    int j = n;
    for (int i = 1; i <= n; i++){
        sl += (fr[i] - fr[i - 1]) * (n - j);
        while (j > 0 && fr[i] > fl[j]){
            sl -= fl[j];
            sl += fr[i];
            j--;
        }
        r[i] = sl;
    }
    j = 1;
    for (int i = n; i >= 1; i--){
        sr += (fl[i] - fl[i + 1]) * (j - 1);
        while (j <= n && fl[i] > fr[j]){
            sr -= fr[j];
            sr += fl[i];
            j++;
        }
        l[i] = sr;
    }
    c[1] = 0;
    sl = 0;
    sr = a[1];
    int tl = n, tr = 1;
    for (int i = 2; i < n; i++){
        sl += fl[n - i + 2];
        sr += fr[i];
        sl += (fr[i] - fr[i - 1]) * (n - tl);
        sr += (fl[n - i + 2] - fl[n - i + 3]) * (tr - 1);
        while (tl >= n - i + 2 && fr[i] > fl[tl]){
            sl -= fl[tl];
            sl += fr[i];
            tl--;
        }
        while (tr <= i && fl[n - i + 2] > fr[tr]){
            sr -= fr[tr];
            sr += fl[n - i + 2];
            tr++;
        }
        c[i] = sl + sr - max(fl[n - i + 2], fr[i]) + c[i - 1];
    }
    sl = 0; sr = 0;
    for (int i = 1; i <= n; i++) sl += l[i];
    for (int i = 1; i < n; i++){
        sr += r[i];
        sl -= l[n - i + 2];
        re = (re + sl - sr + c[i]) % modulo;
    }
    return re;
}

LL solve3(){
    LL re = 0, mx = 0;
    for (int i = 1; i <= n; i++) mx = max(mx, a[i]);
    for (int i = 1; i < n - 1; i++) re = (re + mx * (s[n] - s[i + 1]) % modulo * i) % modulo;
    return re;
}

int main(){
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    for (int i = 1; i <= n; i++) s[i] = s[i - 1] + i;
    LL t1 = solve1();
    LL t2 = solve2();
    LL t3 = solve3();
    printf("%lld", (t1 + t2 + t3) % modulo);

    return 0;
}