#include #define taskname "test" #define x first #define y second using namespace std; typedef long long LL; typedef pair PII; const int maxn = 200000 + 7; const int maxa = 1e6; const int module = 1e9 + 7; int n; LL res; LL a[maxn], fl[maxn], fr[maxn], l[maxn], r[maxn], w[maxn]; LL ps[maxn]; stack xep; template inline void read(T &x){ x = 0; char ch; int positive = 1; while (!isdigit(ch = getchar())) if (ch == '-') positive = 0; do x = x * 10 + ch - '0'; while (isdigit(ch = getchar())); if (!positive) x = -x; } void input() { read(n); for(int i = 1; i <= n; ++i) read(a[i]); } LL sumcs(int i, int j) { return ps[j] - ps[i - 1]; } void task1() { int last = 0, sum = 0; xep.push({module, 0}); for(int i = 1; i <= n; ++i){ while (xep.top().x <= a[i]) { PII p = xep.top(); xep.pop(); last = (last + 1LL * (module - p.x) * (p.y - xep.top().y)) % module; sum = (sum + sumcs(i - p.y, i - xep.top().y - 1) % module * (a[i] + module - p.x)) % module; } last = (last + 1LL * a[i] * (i - xep.top().y)) % module; xep.push({a[i], i}); sum = (sum + last) % module; res += sum; } res = res % module; } void task2() { LL sl = 0, sr = 0; for(int i = 1; i <= n; ++i) fl[i] = max(fl[i - 1], a[i]); for(int i = 1; i <= n; ++i) sl += fl[i]; for(int i = n; i >= 1; --i) fr[i] = max(fr[i + 1], a[i]); for(int i = n; i >= 1; --i) sr += fr[i]; int j = n; for(int i = 1; i <= n; ++i) { sr += (fl[i] - fl[i - 1]) * (n - j); while (j && fl[i] > fr[j]) sr += (fl[i] - fr[j--]); l[i] = sr % module; } j = 1; for(int i = n; i >= 1; --i) { sl += (fr[i] - fr[i + 1]) * (j - 1); while (j <= n && fr[i] > fl[j]) sl += (fr[i] - fl[j++]); r[i] = sl % module; } sl = a[1], sr = 0; int tl = 1, tr = n; for(int i = 2; i < n; ++i) { sr += fr[n - i + 2]; sl += fl[i]; sr += (fl[i] - fl[i - 1]) * (n - tr); sl += (fr[n - i + 2] - fr[n - i + 3]) * (tl - 1); while (tr >= n - i + 2 && fl[i] > fr[tr]) sr += (fl[i] - fr[tr--]); while (tl <= i && fr[n - i + 2] > fl[tl]) sl += (fr[n - i + 2] - fl[tl++]); w[i] = (w[i - 1] + sr + sl + module - max(fl[i], fr[n - i + 2])) % module; } sl = sr = 0; for(int i = 1; i <= n; ++i) sr += r[i]; for(int i = 1; i < n; ++i) { sl += l[i]; sr -= r[n - i + 2]; res = (res + sr - sl + w[i]) % module; } } void task3() { for(int i = 1; i < n - 1; ++i) res = (res + fl[n] * sumcs(i + 2, n) % module * i % module); res = res % module; } void solve() { for(int i = 1; i <= n; ++i) ps[i] = ps[i - 1] + i; task1(); task2(); task3(); printf("%lld", res); } int main() { //freopen(taskname".inp","r",stdin); //freopen(taskname".ans","w",stdout); input(); solve(); return 0; }