#include using namespace std; const int MX = 200001, md = 1000000007; int a[MX], L[MX], R[MX]; int main() { int n; ignore = scanf("%d", &n); for (int i = 0; i < n; i++) ignore = scanf("%d", a + i); int x = n * (n + 1ll) / 2 % md; x = x * (x + 1ll) / 2 % md; { a[n] = md; vector s = {-1}; for (int i = 0; i <= n; i++) { while (s.size() > 1u && a[s.back()] < a[i]) { R[s.back()] = i - 1; s.pop_back(); } L[i] = s.back(); s.push_back(i); } } int ans = 0; for (int i = 0; i < n; i++) { int sum = ( (i - L[i]) * ((R[i] * (R[i] + 1ll) - i * (i - 1ll)) / 2 % md) + (R[i] - i + 1) * (i - L[i] - (i * (i + 1ll) - L[i] * (L[i] + 1ll)) / 2 % md) ) % md; if (sum < 0) sum += md; ans = (ans + a[i] * 1ll * sum) % md; x = (x + md - sum) % md; } for (int r = 0, mxp = 0, l = n; r < n; r++) { mxp = max(a[r], mxp); while (l > 0 && a[l - 1] < mxp) l--; int sum = ( n - l < r ? (n - l) * (n - l + 1ll) / 2 : r * (r + 1ll) / 2 + r * 1ll * (n - l - r) ) % md; ans = (ans + mxp * 1ll * sum) % md; x = (x + md - sum) % md; } for (int l = n - 1, mxs = 0, r = -1; l >= 0; l--) { mxs = max(a[l], mxs); while (r + 1 < n && a[r + 1] <= mxs) r++; int sum = ( n - l > r ? r * (r + 1ll) / 2 : (n - l) * (n - l + 1ll) / 2 + (n - l) * 1ll * (r + l - n) ) % md; ans = (ans + mxs * 1ll * sum) % md; x = (x + md - sum) % md; } ans = (ans + x * 1ll * *max_element(a, a + n)) % md; printf("%d\n", ans); return 0; }