/*** 10 1 5 4 9 3 5 1 6 8 1 20 ***/ #include using namespace std; typedef long long ll; #define MOD (1000000007ll) #define mod(x) ((((x)%MOD)+MOD)%MOD) ll CAL(ll n) { return mod(mod(2 * mod(mod(n * n) * mod(n * n)) + 4 * mod(n * n) + 8 * n + (n % 2 ? 1 : -1) + 1) * 562500004); } void NGE(ll a[], ll n, ll N[]) { vector>X; for (ll i = n - 1; i >= 0; i--) { while (!X.empty() && X.back().first <= a[i]) X.pop_back(); if (X.empty()) N[i] = n; else N[i] = X.back().second; X.push_back(make_pair(a[i], i)); } } void PGE(ll a[], ll n, ll N[]) { vector>X; for (ll i = 0; i < n; i++) { while (!X.empty() && X.back().first < a[i]) X.pop_back(); if (X.empty()) N[i] = -1; else N[i] = X.back().second; X.push_back(make_pair(a[i], i)); } } ll f(ll a, ll b) { return mod(mod(mod(a + 1) * mod(b + 1)) * mod(mod(a + b + 2) * 500000004)); } ll sum(ll a[], ll n) { ll PR[n]; ll NE[n]; PGE(a, n, PR); NGE(a, n, NE); ll ans = 0; for (ll i = 0; i < n; i++) { ans = mod(ans + a[i] * f(i - PR[i] - 1, NE[i] - i - 1)); if (make_pair(PR[i], NE[i]) == make_pair(-1ll, n)) ans = mod(ans - a[i] * n); } ll A[n + 2]; A[0] = 0; for (ll i = 1; i <= n; i++) A[i] = max(A[i - 1], a[i - 1]); ll B[n + 2]; B[0] = 0; for (ll i = 1; i <= n; i++) B[i] = max(a[n - i], B[i - 1]); A[n + 1] = A[n]; B[n + 1] = max(B[n + 1], A[n + 1]); ll S[n + 2]; ll Sum[n + 2]; S[0] = 0; Sum[0] = 0; for (ll i = 1; i <= n; i++) { S[i] = mod(S[i - 1] + B[i] * i); Sum[i] = mod(Sum[i - 1] + B[i]); } for (ll t = 2; t < n; t++) { ll lo = 0; ll hi = n + 1; while (lo < hi) { ll k = (lo + hi) / 2; if (A[t] <= B[k]) hi = k; else lo = k + 1; } ll i = (lo + hi) / 2; ll a = min(t - 1, n - t - 1); ll c = min(i - 1, a); ans = mod(ans + A[t] * mod(c * (c + 1) / 2)); if (i <= a) { ans = mod(ans + S[a]); if (i - 1 >= 0) ans = mod(ans - S[i - 1]); } if (t <= n - t - 1) { ll a = t; ll b = n - t - 1; if (a <= i && i <= b) { ans = mod(ans + (t - 1) * mod(Sum[b] - Sum[i - 1])); ans = mod(ans + A[t] * mod((i - a) * (t - 1))); } else if (i < a) ans = mod(ans + (t - 1) * mod(Sum[b] - Sum[a - 1])); else if (i > b) ans = mod(ans + (t - 1) * mod(A[t] * (b - a + 1))); if (false) for (ll v = a; v <= b; v++) { ans = mod(ans + max(A[t], B[v]) * (t - 1)); } } } ll mx = 0; for (ll i = 0; i < n; i++) mx = max(mx, a[i]); ans = mod(ans + mx * CAL(n)); return ans; } int main() { ll n; cin >> n; ll a[n]; for (ll i = 0; i < n; i++) cin >> a[i]; cout << sum(a, n); }