#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <ctype.h>
#include <deque>
#include <cstring>
#include <set>
#include <bitset>
#include <map>
#include <chrono>
#include <random>
#include <unordered_map>
#include <stdio.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef std::vector<int> vi;
typedef std::vector<bool> vb;
typedef std::vector<string> vs;
typedef std::vector<double> vd;
typedef std::vector<long long> vll;
typedef std::vector<std::vector<int> > vvi;
typedef vector<vll> vvll;
typedef std::vector<std::pair<int, int> > vpi;
typedef vector<vpi> vvpi;
typedef std::pair<int, int> pi;
typedef std::pair<ll, ll> pll;
typedef std::vector<pll> vpll;

const long long mod = 1000000007;
const unsigned gen_seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937_64 gen(gen_seed);

#define all(c) (c).begin(),(c).end()
#define forn(i, a, b) for(int i = a; i < b; i++)
#define read(x) scanf("%d", &x)
#define readv(x, n) vi x(n); forn(i,0,n) scanf("%d", &x[i])

#define pb push_back
#define mp make_pair

ll getdown(ll a, ll b) {
    ll k = min(a,b);
    if(k==0) return 0;
    ll res = a*b%mod*(k+1) - k*(k+1)/2%mod*(a+b);
    ll k1 = k*(k+1)/2;
    ll k2 = 2*k+1;
    if(k1%3 == 0) k1/=3;
    else k2/=3;
    k1%=mod;
    res += k1*k2;
    return res%mod;
}

int main()
{

//    int num = 1;
//    while(1) {
//        num++;
    int n;
    scanf("%d", &n);
//        n =4;
    readv(a,n);
//        vi a(n);
//        int nwas = num;
//        forn(i,0,n) {
//            a[i] = nwas%n;
//            nwas/=n;
//        }
    ll ans2 = 0;
    if(n <= -1) {
        vvi am(n, vi(n));
        forn(i,0,n) {
            int cur = 0;
            forn(j,i,n) {
                cur = max(cur, a[j]);
                am[i][j] = cur;
            }
        }
        vi b;
        ll m = 0;
        forn(l,0,n) forn(i,0,n-l) b.pb(am[i][i+l]), m++;
        
        vi li(m,-1);
        vi ri(m,m);
        const int INF = 1e8;
        deque<pi> d;
        d.pb(mp(INF,-1));
        forn(i,0,m) {
            while(b[i] > d.back().first) d.pop_back();
            li[i] = d.back().second;
            d.pb(mp(b[i],i));
        }
        d.clear();
        d.pb(mp(INF, m));
        for(int i = m-1; i>=0; i--) {
            while(b[i] >= d.back().first) d.pop_back();
            ri[i] = d.back().second;
            d.pb(mp(b[i],i));
        }
        ll ans = 0;
        forn(i,0,m) {
            ans = (ans + (ll(i-li[i])*ll(ri[i]-i))%mod * ll(b[i]))%mod;
            
        }
        ans2 = ans;
    }
    
    const int INF = 1e8;
    deque<pi> dls;
    dls.pb(mp(INF,-1));
    vi li(n), ri(n);
    vi pli(n,-1), pri(n,-1);
    forn(i,0,n) {
        while(a[i] > dls.back().first) dls.pop_back();
        li[i] = dls.back().second;
        dls.pb(mp(a[i],i));
    }
    deque<pi> dr;
    dr.pb(mp(INF, n));
    for(int i = n-1; i>=0; i--) {
        while(a[i] >= dr.back().first) dr.pop_back();
        ri[i] = dr.back().second;
        dr.pb(mp(a[i],i));
    }
    int pt = dls.size() - 1;
    forn(i,0,n) {
        if(li[i] == -1) {
            while(dls[pt].first <= a[i]) pt--;
            pli[i] = dls[pt].second;
        }
    }
    pt = dr.size() - 1;
    for(int i =n-1; i>=0; i--) {
        if(ri[i] == n) {
            while(dr[pt].first < a[i]) pt--;
            pri[i] = dr[pt].second;
        }
    }
    ll ans = 0;
    ll totp = 0;
    ll vmax = 0;
    forn(i,0,n) {
        if(li[i] != -1 && ri[i] != n) {
            ll l = i-li[i];
            ll r = ri[i]-i;
            ll lpr = l+r;
            if(l%2==0) l/=2;
            else if(r%2==0) r/=2;
            else lpr/=2;
            ll cnt = l*r%mod*lpr%mod;
            totp += cnt;
            ans = (ans + cnt*ll(a[i]))%mod;
        }
        else if(li[i] == -1 && ri[i] == n) vmax = ll(a[i]);
        else if(li[i] == -1){
            ll lp = n-pli[i];
            ll l2 = i+1;
            ll r2 = ri[i] - i;
            ll l = l2;
            ll r = r2;
            ll lpr = l+r;
            if(l2%2==0) l2/=2;
            else if(r2%2==0) r2/=2;
            else lpr/=2;
            ll cnt = l2*r2%mod*lpr%mod;
            cnt -= lp*r;
            cnt = (cnt%mod + mod)%mod;
            if(lp <= l) {
                cnt += lp*(lp+1)/2%mod*r;
                cnt%=mod;
                totp += cnt;
                ans = (ans + cnt*ll(a[i]))%mod;
            }
            else {
                ll cnt2 = (lp*(lp+1)/2 - (lp-l+1)*(lp-l)/2)%mod*r;
                cnt2 += getdown(lp-l, r-1);
                cnt = (cnt+cnt2)%mod;
                totp += cnt;
                ans = (ans + cnt*ll(a[i]))%mod;
            }
        }
        else if(ri[i] == n) {
            ll l = i-li[i];
            ll r = n - i;
            ll lp = pri[i]-1;
            swap(l,r);
            ll l2 = l;
            ll r2 = r;
            ll lpr = l+r;
            if(l%2==0) l2/=2;
            else if(r%2==0) r2/=2;
            else lpr/=2;
            ll cnt = l2*r2%mod*lpr%mod;
//            cnt -= lp*r;
            cnt = (cnt%mod + mod)%mod;
            if(lp <= l) {
                cnt += lp*(lp+1)/2%mod*r;
                cnt%=mod;
                totp += cnt;
                ans = (ans + cnt*ll(a[i]))%mod;
            }
            else {
                ll cnt2 = (lp*(lp+1)/2 - (lp-l+1)*(lp-l)/2)%mod*r;
                cnt2 += getdown(lp-l, r-1);
                cnt = (cnt+cnt2)%mod;
                totp += cnt;
                ans = (ans + cnt*ll(a[i]))%mod;
            }
        }
    }
    ll totcnt = ll(n)*ll(n+1)/2%mod;
    totcnt = (totcnt+1)*totcnt/2%mod;
    ll mcnt = (mod + totcnt - totp%mod)%mod;
    ans = (ans + mcnt*vmax)%mod;
    
//        if(ans2 != ans) {
//            forn(i,0,n) printf("%d ", a[i]);
//            cout<<endl;
//            cout<<ans2<<endl;
//                cout<<ans<<endl;
//            break;
//            
//        }

    cout<<ans<<endl;
//    }
    
}