#include using namespace std; #define ll long long #define f(i, x, n) for(int i = x; i < (int)(n); ++i) int const N = 200000; int md = 1e9 + 7, sq[N + 1], n; pair x[N << 1]; inline void ad(int &x, int y) { if ((x += y) >= md)x -= md; } inline void sb(int &x, int y) { if ((x -= y) < 0)x += md; } inline int sm(int x) { return ((ll)(x + 1) * x >> 1) % md; } int ann(int l, int r, int z){ int ln = r - n; int s = n - l; int tmp; if (ln >= s){ tmp = sq[s]; int d = sm(s); ad(tmp, (ll)d * (ln - s) % md); }else { tmp = sq[ln]; int d = sm(ln); ad(tmp, (ll)d * (s - ln) % md); } return (ll)tmp * z % md; } int main(){ scanf("%d", &n); f(i, 1, n + 1)sq[i] = (sq[i - 1] + (ll)i * i) % md; int mx = 0; f(i, 0, n){ int t; scanf("%d", &t); x[i << 1] = make_pair(t, i); x[i << 1 | 1] = make_pair(t, i + n); mx = max(mx, t); } sort(x, x + (n << 1)); int an = 0, ln = sm(n); int tln = ln; sb(tln, n - 1 << 1 | 1); ad(an, (ll)sm(tln) * mx % md); //printf("%d\n", an); f(i, 4, n << 1){ int k = i >> 1; ad(an, (ll)sm(k - 1) * mx % md); int g = k + 1; g = i - g - 1; int tmp = sm(g); sb(tmp, sm(max(0, g - (n - k - 1)))); ad(an, (ll)tmp * mx % md); } //printf("%d\n", an); set st; st.insert(-1); st.insert(n << 1); for (int i = (n << 1) - 1; i >= 0; --i){ set::iterator it = st.lower_bound(x[i].second); int r = *it - 1; --it; int l = *it + 1; st.insert(x[i].second); if (l >= n)continue; int &z = x[i].first, &j = x[i].second; if (r >= n){ ad(an, ann(l, r, z)); if (j > n)sb(an, ann(l, j - 1, z)); else if (j < n - 1)sb(an, ann(j + 1, r, z)); } //printf("%d %d\n", j, an); r = min(r, n - 1); if (j > r)continue; int mn = min(r - j, j - l) + 1; ad(an, (ll)sq[mn] * z % md); //printf("%d %d\n", j, an); int mx = max(r - j, j - l) + 1; int tmp = sm(mx); sb(tmp, sm(mn)); ad(an, (ll)mn * tmp % md * z % md); //printf("%d %d\n", j, an); if (mn != 1){ int ed = r - l + 1; tmp = sm(ed); sb(tmp, sm(mx)); int k = (ll)tmp * (ed - mx) % md; sb(k, (sq[ed - mx - 1] + (ll)sm(ed - mx - 1) * (mx + 1)) % md); ad(an, (ll)k * z % md); //printf("%d %d\n", j, an); } } printf("%d\n", an); }