#include #define LL long long using namespace std; const int maxn = 200010; const int modulo = 1000000007; int n; LL a[maxn], l[maxn], r[maxn], c[maxn], s[maxn], fl[maxn], fr[maxn]; stack> st; LL solve1(){ LL re = 0, last = 0, tg = 0; st.push({modulo, 0}); for (int i = 1; i <= n; i++){ while (a[i] >= st.top().first){ pair tmp = st.top(); st.pop(); last = (last + modulo - (LL) tmp.first * (tmp.second - st.top().second)) % modulo; tg = (tg + (a[i] - tmp.first) * (s[i - st.top().second - 1] - s[i - tmp.second - 1])) % modulo; } last = (last + a[i] * (i - st.top().second)) % modulo; st.push({a[i], i}); tg += last; re += tg; } return re; } LL solve2(){ LL re = 0, sl = 0, sr = 0; for (int i = 1; i <= n; i++){ fr[i] = max(fr[i - 1], a[i]); sr += fr[i]; } for (int i = n; i >= 1; i--){ fl[i] = max(fl[i + 1], a[i]); sl += fl[i]; } int j = n; for (int i = 1; i <= n; i++){ sl += (fr[i] - fr[i - 1]) * (n - j); while (j > 0 && fr[i] > fl[j]){ sl -= fl[j]; sl += fr[i]; j--; } r[i] = sl; } j = 1; for (int i = n; i >= 1; i--){ sr += (fl[i] - fl[i + 1]) * (j - 1); while (j <= n && fl[i] > fr[j]){ sr -= fr[j]; sr += fl[i]; j++; } l[i] = sr; } c[1] = 0; sl = 0; sr = a[1]; int tl = n, tr = 1; for (int i = 2; i < n; i++){ sl += fl[n - i + 2]; sr += fr[i]; sl += (fr[i] - fr[i - 1]) * (n - tl); sr += (fl[n - i + 2] - fl[n - i + 3]) * (tr - 1); while (tl >= n - i + 2 && fr[i] > fl[tl]){ sl -= fl[tl]; sl += fr[i]; tl--; } while (tr <= i && fl[n - i + 2] > fr[tr]){ sr -= fr[tr]; sr += fl[n - i + 2]; tr++; } c[i] = sl + sr - max(fl[n - i + 2], fr[i]) + c[i - 1]; } sl = 0; sr = 0; for (int i = 1; i <= n; i++) sl += l[i]; for (int i = 1; i < n; i++){ sr += r[i]; sl -= l[n - i + 2]; re = (re + sl - sr + c[i]) % modulo; } return re; } LL solve3(){ LL re = 0, mx = 0; for (int i = 1; i <= n; i++) mx = max(mx, a[i]); for (int i = 1; i < n - 1; i++) re = (re + mx * (s[n] - s[i + 1]) % modulo * i) % modulo; return re; } int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (int i = 1; i <= n; i++) s[i] = s[i - 1] + i; LL t1 = solve1(); LL t2 = solve2(); LL t3 = solve3(); printf("%lld", (t1 + t2 + t3) % modulo); return 0; }