#include <bits/stdc++.h>

using namespace std;

const int MX = 200001, md = 1000000007;

int a[MX], L[MX], R[MX];

int main() {
	int n;
	ignore = scanf("%d", &n);
	for (int i = 0; i < n; i++) ignore = scanf("%d", a + i);
    
	int x = n * (n + 1ll) / 2 % md;
	x = x * (x + 1ll) / 2 % md;
    
    {
        a[n] = md;
        vector<int> s = {-1};
        for (int i = 0; i <= n; i++) {
            while (s.size() > 1u && a[s.back()] < a[i]) {
                R[s.back()] = i - 1;
                s.pop_back();
            }
            
            L[i] = s.back();
            s.push_back(i);
        }
    }
	
	int ans = 0;
	for (int i = 0; i < n; i++) {
        int sum = (
            (i - L[i]) * ((R[i] * (R[i] + 1ll) - i * (i - 1ll)) / 2 % md) + 
            (R[i] - i + 1) * (i - L[i] - (i * (i + 1ll) - L[i] * (L[i] + 1ll)) / 2 % md)
        ) % md;
        if (sum < 0) sum += md;
        ans = (ans + a[i] * 1ll * sum) % md;
        x = (x + md - sum) % md;
	}
    
    for (int r = 0, mxp = 0, l = n; r < n; r++) {
        mxp = max(a[r], mxp);
        while (l > 0 && a[l - 1] < mxp) l--;
        
        int sum = (
            n - l < r ? 
                (n - l) * (n - l + 1ll) / 2 : 
                r * (r + 1ll) / 2 + r * 1ll * (n - l - r)
        ) % md;
        ans = (ans + mxp * 1ll * sum) % md;
        x = (x + md - sum) % md;
    }
    
    for (int l = n - 1, mxs = 0, r = -1; l >= 0; l--) {
        mxs = max(a[l], mxs);
        while (r + 1 < n && a[r + 1] <= mxs) r++;
        
        int sum = (
            n - l > r ?
                r * (r + 1ll) / 2 :
                (n - l) * (n - l + 1ll) / 2 + (n - l) * 1ll * (r + l - n)
        ) % md;
        ans = (ans + mxs * 1ll * sum) % md;
        x = (x + md - sum) % md;
    }
    
	ans = (ans + x * 1ll * *max_element(a, a + n)) % md;
	printf("%d\n", ans);
	
	return 0;
}