#include <bits/stdc++.h>
#define fi first
#define se second
#define FIN "max-transform.inp"
#define FON "max-transform.out"
using namespace std;
typedef pair<int,int> ii;

const int MOD = 1e9+7;
const int N = 2e5;

int n,a[N+1],ftail[N+1];

inline int sum(long long l,long long r)
{
    return ((r+l)*(r-l+1) >> 1) % MOD;
}
inline int sum2(int n)
{
    return (long long)n*(n+1)*((n<<1)+1)/6 % MOD;
}
void init(int n)
{
    ftail[1] = 1;
    for(int i=2; i<=n; ++i)
        ftail[i] = (ftail[i-1] + sum(1,i)) % MOD;
}
void solve(int &res, int val,int l,int mid,int r)
{
    //cout << val << ' ' << l << ' ' << mid << ' ' << r << endl;
    int d1 = mid-l, d2 = r-mid;
    if (d1 > d2) swap(d1, d2);
    (res += (long long)sum2(d1) * val % MOD) %= MOD;
    if (d2 > d1) (res += (long long)sum(d1+1, d2)*d1 % MOD * val % MOD) %= MOD;
    if (d2 < r-l-1) {
        int tmp = (ftail[r-l-1] - ftail[d2] - (long long)sum(1,d2)*(r-l-1-d2)) % MOD;
        if (tmp < 0) tmp += MOD;
        (res += (long long)tmp * val %MOD) %= MOD;
    }
    //cout << res << endl;
}
void phase1(int &res)
{
    ii b[N+1];
    for(int i=1; i<=n; ++i)
        b[i] = ii(a[i], i);
    sort(b+1, b+n+1);

    set<int> sright;
    for(int i=1; i<=n; ++i) sright.insert(i);

    set<int>::iterator ite;
    for(int i=1,l,r; i<=n; ++i)
    {
        sright.erase(b[i].se);
        ite = sright.upper_bound(b[i].se);
        r = ite==sright.end() ? n+1 : *ite;
        if (sright.size() > 0 && ite!=sright.begin())
        {
            --ite;
            l = *ite;
        }
        else l = 0;
        solve(res, b[i].fi, l, b[i].se, r);
    }
}
int get(int pre, int cur, int mid)
{
    if (mid <= pre) return sum(n-cur+1, n-pre);
    return (sum(n-cur+1, n-mid+1) + (long long)(n-mid+1)*(mid-pre-1)) % MOD;
}
void phase2(int &res)
{
    if (n<2) return;
    int stk[N+1], top = 0, head = a[1], sleft=0, sright=0, mid = n, pm;
    stk[0] = 0;
    for(int i=2; i<=n; ++i)
        if (a[i] > head)
        {
            while (top > 0 && a[stk[top]] <= a[i]) --top;
            stk[++top] = i;
        }
    for(int i=1; i<=top; ++i)
        (sleft += (long long)a[stk[i]]*(stk[i]-stk[i-1]) % MOD) %= MOD;
    pm = top+1;
    for(int i=2; i<=n; ++i,--mid)
    {
        if (pm > top+1) pm = top+1;
       if (stk[pm-1] >= mid) {
           (sright += (long long)a[stk[pm-1]]*(stk[pm-1]-stk[pm-2]) % MOD * (n-mid+1) % MOD) %= MOD;
           (sleft -= (long long)a[stk[pm-1]]*(stk[pm-1]-stk[pm-2]) % MOD) %= MOD;
           if (sleft < 0) sleft += MOD;
           --pm;
       }
       else if (pm<=top)
       {
           (sright += (long long)a[stk[pm]]*(mid-stk[pm-1]) % MOD) %= MOD;
       }

        head = max(head, a[i]);
        while (top>0 && a[stk[top]]<=head)
        {
            if (stk[top]<mid)
            {
                (sleft -= (long long)a[stk[top]]*(stk[top]-stk[top-1]) % MOD) %= MOD;
                if (sleft < 0) sleft += MOD;
            }
            else
            {
                (sright -= (long long)a[stk[top]]*get(stk[top-1],stk[top],mid) % MOD) %= MOD;
                if (sright < 0) sright += MOD;
            }
            --top;
        }
        //if (i==3) cout << sleft << ' ' << sright <<endl;
       (res += ((long long)sleft*(n-mid+1) + sright) % MOD) %= MOD;
       if (stk[top]<n) (res += (long long)head*get(stk[top],n,mid) % MOD) %= MOD;

       //cout << res << endl;
    }
}
void phase3(int &res)
{
    int cnt = ftail[n];
    for(int i=n; i>1; --i)
        (cnt += (long long)i*(i-1) % MOD) %= MOD;
    int m = (long long)n*(n+1)/2 % MOD;
    cnt = ((long long)m*(m+1)/2 - cnt) % MOD;
    (res += (long long)*max_element(a+1,a+n+1)*cnt % MOD) %= MOD;
}

int main()
{
    //freopen(FIN,"r",stdin);
   // freopen(FON,"w",stdout);
    ios_base::sync_with_stdio(0);
    cin >> n;
    for(int i=1; i<=n; ++i) cin >> a[i];
    init(n);
    int res = 0;
    phase1(res);
    phase2(res);
    phase3(res);
    cout << res;
}