#include <bits/stdc++.h>

#define taskname "test"
#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int maxn = 200000 + 7;
const int maxa = 1e6;
const int module = 1e9 + 7;

int n;
LL res;
LL a[maxn], fl[maxn], fr[maxn], l[maxn], r[maxn], w[maxn];
LL ps[maxn];
stack<PII> xep;

template <typename T> inline void read(T &x){
    x = 0; char ch; int positive = 1;
    while (!isdigit(ch = getchar())) if (ch == '-') positive = 0;
    do x = x * 10 + ch - '0'; while (isdigit(ch = getchar()));
    if (!positive) x = -x;
}

void input() {
    read(n);
    for(int i = 1; i <= n; ++i) read(a[i]);
}

LL sumcs(int i, int j) {
    return ps[j] - ps[i - 1];
}

void task1() {
    int last = 0, sum = 0;
    xep.push({module, 0});
    for(int i = 1; i <= n; ++i){
        while (xep.top().x <= a[i]) {
            PII p = xep.top();
            xep.pop();
            last = (last + 1LL * (module - p.x) * (p.y - xep.top().y)) % module;
            sum = (sum + sumcs(i - p.y, i - xep.top().y - 1) % module * (a[i] + module - p.x)) % module;
        }
        last = (last + 1LL * a[i] * (i - xep.top().y)) % module;
        xep.push({a[i], i});
        sum = (sum + last) % module;
        res += sum;
    }
    res = res % module;
}

void task2() {

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

void task3() {
    for(int i = 1; i < n - 1; ++i) res = (res + fl[n] * sumcs(i + 2, n) % module * i % module);
    res = res % module;
}

void solve() {
    for(int i = 1; i <= n; ++i) ps[i] = ps[i - 1] + i;
    task1();
    task2();
    task3();
    printf("%lld", res);
}

int main() {
    //freopen(taskname".inp","r",stdin);
	//freopen(taskname".ans","w",stdout);
	input();
	solve();
	return 0;
}