#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef long double ld; typedef std::vector vi; typedef std::vector vb; typedef std::vector vs; typedef std::vector vd; typedef std::vector vll; typedef std::vector > vvi; typedef vector vvll; typedef std::vector > vpi; typedef vector vvpi; typedef std::pair pi; typedef std::pair pll; typedef std::vector 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 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 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 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<