#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = (int)1.01e9;
const int MOD = (int)1e9 + 7;
//#define int long long

int sum(vector<ll> a) {
    int res = 0;
    for (int x : a) res = (res + x) % MOD;
    return res;
}

vector<ll> f(vector<ll> a) {
    int n = a.size();
    auto b = a;
    vector<ll> res;
    for (int len = 1; len <= n; len++) {
        for (int i = 0; i + len <= n; i++) {
            b[i] = max(b[i], a[i + len - 1]);
            res.push_back(b[i]);
        }
    }
    return res;
}

int slow(vector<ll> a) {
    return sum(f(f(a)));
}

int fast(vector<ll> a) {
    int n = a.size();

    vector<pair<int, int> > st;
    st.push_back({INF, -1});
    a.push_back(INF - 1);

    int cnt = 0;
    int ans = 0;
    for (int i = 0; i <= n; i++) {
        while (st.back().first <= a[i]) {
            int pos = st.back().second;
            st.pop_back();

            int left = pos - st.back().second - 1;
            int right = i - pos - 1;
            // sum l=0..left, r=0..right (l+r+1)*a[pos]
            // a[pos]*(left+1)*(right+1)
            // a[pos]*(left+1)*(right)*(right+1)/2
            // a[pos]*(left+1)*(left)*(right+1)/2
            ans = (ans + 1LL * a[pos] * (left + 1) % MOD * (right + 1)) % MOD;
            ans = (ans + 1LL * a[pos] * (left + 1) % MOD * (1LL * right * (right + 1) / 2 % MOD)) % MOD;
            ans = (ans + 1LL * a[pos] * (right + 1) % MOD * (1LL * left * (left + 1) / 2 % MOD)) % MOD;


            cnt = (cnt + 1LL * (left + 1) % MOD * (right + 1)) % MOD;
            cnt = (cnt + 1LL * (left + 1) % MOD * (1LL * right * (right + 1) / 2 % MOD)) % MOD;
            cnt = (cnt + 1LL * (right + 1) % MOD * (1LL * left * (left + 1) / 2 % MOD)) % MOD;
        }
        st.push_back({a[i], i});
    }

    vector<int> pref(n);
    pref[0] = a[0];
    for (int i = 1; i < n; i++) pref[i] = max((ll)pref[i - 1], a[i]);

    vector<int> prefsum1(n + 1);
    for (int i = 1; i <= n; i++) prefsum1[i] = (prefsum1[i - 1] + pref[i - 1] * 1LL * (i - 1)) % MOD;
    auto getSum1 = [&](int l, int r) {
        if (l > r) return 0LL;
        return (ll)(prefsum1[r + 1] - prefsum1[l] + MOD) % MOD;
    };

    vector<int> prefsum2(n + 1);
    for (int i = 1; i <= n; i++) prefsum2[i] = (prefsum2[i - 1] + pref[i - 1]) % MOD;
    auto getSum2 = [&](int l, int r) {
        if (l > r) return 0LL;
        return (ll)(prefsum2[r + 1] - prefsum2[l] + MOD) % MOD;
    };


    int cur = 0;
    for (int i = n - 1; i >= 0; i--) {
        cur = max((ll)cur, a[i]);

        int i1 = lower_bound(pref.begin(), pref.end(), cur) - pref.begin() - 1; // less maximum
        int i2 = n - i - 1; // less cnt elements
        int i3 = i - 1; // bound

        int ii = min(i1, i2);
        ii = min(ii, i3);
        ans = (ans + 1LL * cur * (1LL * ii * (ii + 1) / 2 % MOD)) % MOD;
        cnt = (cnt + 1LL * (1LL * ii * (ii + 1) / 2 % MOD)) % MOD;

        int ij = max(i1, i2);
        ij = min(ij, i3);
        if (i1 <= i2) {
            ans = (ans + getSum1(ii + 1, ij)) % MOD;
            cnt = (cnt + 1LL * ij * (ij + 1) / 2 % MOD - 1LL * ii * (ii + 1) / 2 % MOD + 5LL * MOD) % MOD;
            //cnt = (cnt + 1LL * max(ij - ii, 0) * (n - i)) % MOD;
        } else {
            int o = max(0LL, (ll)ij - ii);
            ans = (ans + 1LL * cur * o % MOD * (n - i)) % MOD;
            cnt = (cnt + 1LL * o * (n - i)) % MOD;

            //ans = (ans + 1LL * getSum2(ii + 1, ij) * (n - i)) % MOD;
            //cnt = (cnt + max(0, ij - ii) * 1LL * (n - i)) % MOD;

        }
        int ik = i3;
        ans = (ans + 1LL * getSum2(ij + 1, ik) * (n - i)) % MOD;
        cnt = (cnt + 1LL * max((ll)ik - ij, 0LL) * (n - i)) % MOD;
    }

    int mx = -1;
    for (int i = 0; i < n; i++) mx = max((ll)mx, a[i]);

    ll all = 1LL * n * (n + 1) / 2;
    all %= MOD;
    ll all2 = 1LL * all * (all + 1) % MOD * ((MOD + 1) / 2) % MOD;
    //ll all2 = 1LL * all * (all + 1) / 2 % MOD;

    ans = (ans + 1LL * (all2 % MOD - cnt % MOD + MOD) % MOD * mx) % MOD;

    return ans;
}

void stress() {
    for (int it = 25;; it++) {
        cout << it << endl;
        srand(it);

        int n = rand() % 50 + 1;
        vector<ll> a(n);
        for (int i = 0; i < n; i++) a[i] = rand() % n + 1;

        auto ans1 = fast(a);
        auto ans2 = slow(a);
        if (ans1 != ans2) {
            cout << ans1 << " instead of " << ans2 << endl;
            cout << n << endl;
            for (int x : a) cout << x << " ";
            cout << endl;
            fast(a);
            exit(0);
        }
    }
}

signed main() {
#ifdef HOME
    freopen("in", "r", stdin);
#endif
    //stress();

    ll n;
    while (scanf("%lld", &n) == 1) {
        vector<ll> a(n);
        for (int i = 0; i < n; i++) scanf("%lld", &a[i]);

        printf("%lld\n", (ll)fast(a));
    }

    return 0;
}