#include using namespace std; typedef pair pii; const int maxN = 200000 + 10; const int MOD = int(1e9+7); int n, A[maxN]; int L[maxN], R[maxN], sumsq[maxN]; int X[maxN]; // SUM(Smax(len_i)*i) int solve1() { sumsq[0] = 0; for (int i = 1; i <= n; i++) { sumsq[i] = (sumsq[i-1] + 1LL*i*i) % MOD; } R[n] = n; for (int i = n-1; i >= 1; i--) { R[i] = i; while (R[i] < n && A[i] > A[R[i]+1]) { R[i] = R[R[i]+1]; } } int res = 0; for (int i = 1; i <= n; i++) { L[i] = i; if (i > 1) { while (L[i] > 1 && A[i] >= A[L[i]-1]) { L[i] = L[L[i]-1]; } } int ll = i - L[i] + 1, rr = R[i] - i + 1; int mm = min(ll, rr), xx = max(ll, rr), xm; // size 1->mm (num 1->mm) res = (res + 1LL*A[i]*sumsq[mm]) % MOD; // size mm+1->xx (num mm) xm = 1LL*mm*(mm+1+xx)*(xx-mm)/2 % MOD; res = (res + 1LL*A[i]*xm) % MOD; // size xx+1->xx+mm-1 (num mm->1) // i*(xx+mm-i) = i*(xx+mm)-i*i xm = 1LL*(xx+mm)*(mm-1)*mm/2 % MOD; res = (res + 1LL*A[i]*(0LL+MOD+xm-sumsq[mm-1])) % MOD; } return res; } int solve3() { int res = 0, ix; // R->L X[n] = X[n+1] = 0; for (int j = n-1; j >= 1; j--) X[j] = (X[j+1] + L[j+1]) % MOD; ix = 0; for (int i = 1; i <= n; i++) { while (ix + 1 < n && R[n-i+1] >= L[ix+2]) { ix++; } res = (res + (1LL*R[n-i+1]*i)%MOD*max(ix-i+1, 0)) % MOD; res = (res + 1LL*i*X[max(ix+1, i)]) % MOD; } // L->R // 321 <-> 321--333 <-> X[n+1] = 0; for (int i = n; i >= 1; i--) X[i] = (X[i+1] + R[n-i+1]) % MOD; ix = 0; for (int j = 1; j < n; j++) { while (ix + 1 <= n && L[j+1] >= R[n-ix]) { ix++; } res = (res + (1LL*L[j+1]*j)%MOD*max(ix-j, 0)) % MOD; res = (res + 1LL*j*X[max(ix+1, j+1)]) % MOD; } // BF int R2 = 0; // for (int j = 1; j < n; j++) // for (int i = 1; i <= n; i++) { // R2 = (R2 + 1LL*max(R[n-i+1], L[j+1])*min(i, j)) % MOD; // } // printf("%d vs %d\n", res, R2); return (res + R2) % MOD; } void solve() { int res = 0; // SUM(Si*i) res = solve1(); // L[0] = R[n+1] = 0; for (int i = 1; i <= n; i++) { L[i] = max(L[i-1], A[i]); } for (int i = n; i >= 1; i--) { R[i] = max(R[i+1], A[i]); } // SUM(n*(n-1)*(n-2)/2)*MAX int neo = L[n]; for (int i = n; i >= 2; i--) { res = (res + 1LL*i*(i-1)*(i-2)/2%MOD*neo) % MOD; } // SUM(RL(n-i,j)*(i+1)*(j-1)) res = (res + solve3()) % MOD; printf("%d\n", res); } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &A[i]); solve(); return 0; }