#include using namespace std; const int mod = 1000000007; typedef pair pii; #define fi first #define se second #define mp make_pair typedef long long LL; const int N = 200105; int n; int a[N], pos[N], st[N], le[N], ri[N], pre[N]; inline int add(int a, int b) { if ((a+=b) >= mod) return a-mod; else return a; } inline int mul(int a, int b) { return LL(a) * b % mod; } inline int sub(int a, int b) { if ((a-=b) < 0) return a+mod; else return a; } int power(int a, int b) { int r = 1; while (b) { if (b & 1) r = mul(r, a); a = mul(a, a); b >>= 1; } return r; } void add(int val, int le, int ri) { if (le > ri) swap(le, ri); pos[1] = add(pos[1], val); pos[le+2] = sub(pos[le+2], val); pos[ri+2] = sub(pos[ri+2], val); pos[le+ri+3] = add(pos[le+ri+3], val); } int solve(int le, int ri) { int ans = 0; /* for (int k = 1; k <= le && k+1 <= ri; ++k) { ans = add(ans, mul(le-k+1,ri-k)); } */ le++; int t = min(le,ri) - 1; ans = add(ans, mul(t,mul(le,ri))); ans = sub(ans, mul(add(le,ri), LL(t)*(t+1)/2 % mod)); ans = add(ans, pre[t]); return ans; } int main() { scanf("%d", &n); int maxval = 0; for (int i = 1; i <= n; i++) { scanf("%d", a+i); maxval = max(maxval, a[i]); } // tong so phan tu cua S(S(A)) int len_sa = mul(mul(n,n+1),power(2,mod-2)); int len_ssa = mul(mul(len_sa,len_sa+1),power(2,mod-2)); // xet cac phan tu nam gon trong 1 doan int top = 0; for (int i = 1; i <= n; i++) { while (top > 0 && a[st[top]] < a[i]) --top; if (top == 0) le[i] = 0; else le[i] = st[top]; st[++top] = i; } top = 0; for (int i = n; i >= 1; i--) { while (top > 0 && a[st[top]] <= a[i]) --top; if (top == 0) ri[i] = n+1; else ri[i] = st[top]; st[++top] = i; } for (int i = 1; i <= n; i++) { add(a[i],i-le[i]-1,ri[i]-i-1); } int now = 0; int agg = 0; int ans = 0; for (int i = 1; i < n; i++) { agg = add(agg, pos[i]); now = add(now, agg); // process now len_ssa = sub(len_ssa, mul(i,n-i+1)); ans = add(ans, mul(i, now)); } // xet cac phan tu nam cat 2 doan pre[0] = 0; for (int i = 1; i <= n; i++) { pre[i] = add(pre[i-1], mul(i,i)); } // suffix max for (int l = n, r = 1; l >= 1;) { int luu = l; --l; while (l >= 1 && a[l] < a[luu]) --l; while (r <= n && a[r] <= a[luu]) ++r; int t = sub(solve(n-l,r-1),solve(n-luu,r-1)); len_ssa = sub(len_ssa, t); ans = add(ans, mul(t, a[luu])); } // prefix max for (int r = 1, l = n; r <= n;) { int luu = r; ++r; while (r <= n && a[r] <= a[luu]) ++r; while (l >= 1 && a[l] < a[luu]) --l; int t = sub(solve(n-l,r-1),solve(n-l,luu-1)); len_ssa = sub(len_ssa, t); ans = add(ans, mul(t, a[luu])); } ans = add(ans, mul(len_ssa, maxval)); printf("%d", ans); }