#include using namespace std; typedef long long ll; const int INF = (int)1.01e9; const int MOD = (int)1e9 + 7; //#define int long long int sum(vector a) { int res = 0; for (int x : a) res = (res + x) % MOD; return res; } vector f(vector a) { int n = a.size(); auto b = a; vector res; for (int len = 1; len <= n; len++) { for (int i = 0; i + len <= n; i++) { b[i] = max(b[i], a[i + len - 1]); res.push_back(b[i]); } } return res; } int slow(vector a) { return sum(f(f(a))); } int fast(vector a) { int n = a.size(); vector > st; st.push_back({INF, -1}); a.push_back(INF - 1); int cnt = 0; int ans = 0; for (int i = 0; i <= n; i++) { while (st.back().first <= a[i]) { int pos = st.back().second; st.pop_back(); int left = pos - st.back().second - 1; int right = i - pos - 1; // sum l=0..left, r=0..right (l+r+1)*a[pos] // a[pos]*(left+1)*(right+1) // a[pos]*(left+1)*(right)*(right+1)/2 // a[pos]*(left+1)*(left)*(right+1)/2 ans = (ans + 1LL * a[pos] * (left + 1) % MOD * (right + 1)) % MOD; ans = (ans + 1LL * a[pos] * (left + 1) % MOD * (1LL * right * (right + 1) / 2 % MOD)) % MOD; ans = (ans + 1LL * a[pos] * (right + 1) % MOD * (1LL * left * (left + 1) / 2 % MOD)) % MOD; cnt = (cnt + 1LL * (left + 1) % MOD * (right + 1)) % MOD; cnt = (cnt + 1LL * (left + 1) % MOD * (1LL * right * (right + 1) / 2 % MOD)) % MOD; cnt = (cnt + 1LL * (right + 1) % MOD * (1LL * left * (left + 1) / 2 % MOD)) % MOD; } st.push_back({a[i], i}); } vector pref(n); pref[0] = a[0]; for (int i = 1; i < n; i++) pref[i] = max((ll)pref[i - 1], a[i]); vector prefsum1(n + 1); for (int i = 1; i <= n; i++) prefsum1[i] = (prefsum1[i - 1] + pref[i - 1] * 1LL * (i - 1)) % MOD; auto getSum1 = [&](int l, int r) { if (l > r) return 0LL; return (ll)(prefsum1[r + 1] - prefsum1[l] + MOD) % MOD; }; vector prefsum2(n + 1); for (int i = 1; i <= n; i++) prefsum2[i] = (prefsum2[i - 1] + pref[i - 1]) % MOD; auto getSum2 = [&](int l, int r) { if (l > r) return 0LL; return (ll)(prefsum2[r + 1] - prefsum2[l] + MOD) % MOD; }; int cur = 0; for (int i = n - 1; i >= 0; i--) { cur = max((ll)cur, a[i]); int i1 = lower_bound(pref.begin(), pref.end(), cur) - pref.begin() - 1; // less maximum int i2 = n - i - 1; // less cnt elements int i3 = i - 1; // bound int ii = min(i1, i2); ii = min(ii, i3); ans = (ans + 1LL * cur * (1LL * ii * (ii + 1) / 2 % MOD)) % MOD; cnt = (cnt + 1LL * (1LL * ii * (ii + 1) / 2 % MOD)) % MOD; int ij = max(i1, i2); ij = min(ij, i3); if (i1 <= i2) { ans = (ans + getSum1(ii + 1, ij)) % MOD; cnt = (cnt + 1LL * ij * (ij + 1) / 2 % MOD - 1LL * ii * (ii + 1) / 2 % MOD + 5LL * MOD) % MOD; //cnt = (cnt + 1LL * max(ij - ii, 0) * (n - i)) % MOD; } else { int o = max(0LL, (ll)ij - ii); ans = (ans + 1LL * cur * o % MOD * (n - i)) % MOD; cnt = (cnt + 1LL * o * (n - i)) % MOD; //ans = (ans + 1LL * getSum2(ii + 1, ij) * (n - i)) % MOD; //cnt = (cnt + max(0, ij - ii) * 1LL * (n - i)) % MOD; } int ik = i3; ans = (ans + 1LL * getSum2(ij + 1, ik) * (n - i)) % MOD; cnt = (cnt + 1LL * max((ll)ik - ij, 0LL) * (n - i)) % MOD; } int mx = -1; for (int i = 0; i < n; i++) mx = max((ll)mx, a[i]); ll all = 1LL * n * (n + 1) / 2; all %= MOD; ll all2 = 1LL * all * (all + 1) % MOD * ((MOD + 1) / 2) % MOD; //ll all2 = 1LL * all * (all + 1) / 2 % MOD; ans = (ans + 1LL * (all2 % MOD - cnt % MOD + MOD) % MOD * mx) % MOD; return ans; } void stress() { for (int it = 25;; it++) { cout << it << endl; srand(it); int n = rand() % 50 + 1; vector a(n); for (int i = 0; i < n; i++) a[i] = rand() % n + 1; auto ans1 = fast(a); auto ans2 = slow(a); if (ans1 != ans2) { cout << ans1 << " instead of " << ans2 << endl; cout << n << endl; for (int x : a) cout << x << " "; cout << endl; fast(a); exit(0); } } } signed main() { #ifdef HOME freopen("in", "r", stdin); #endif //stress(); ll n; while (scanf("%lld", &n) == 1) { vector a(n); for (int i = 0; i < n; i++) scanf("%lld", &a[i]); printf("%lld\n", (ll)fast(a)); } return 0; }