/* * @Author: kg * @Date: 2017-12-16 18:01:49 * @Last Modified by: kg * @Last Modified time: 2017-12-16 19:03:27 */ #include using namespace std; typedef long long ll; const ll N = 2e5 + 5, MOD = 1e9 + 7; ll t[4 * N], a[N], ans = 0, n, mx = 0; void build(ll v, ll tl, ll tr) { if (tl == tr) { t[v] = a[tr]; return; } ll mid = (tl + tr) / 2; build(2 * v, tl, mid); build(2 * v + 1, mid + 1, tr); t[v] = max(t[2 * v], t[2 * v + 1]); } ll query(ll v, ll tl, ll tr, ll l, ll r) { if (r < tl or tr < l) return 0; if (l <= tl and tr <= r) return t[v]; ll mid = (tl + tr) / 2; return max(query(2 * v, tl, mid, l, r), query(2 * v + 1, mid + 1, tr, l, r)); } int main() { cin >> n; for (ll i = 0; i < n; ++i) cin >> a[i]; build(1, 0, n - 1); // for (int i = 1; i < 2 * n; ++i) cout << t[i] << ' '; // cout << '\n'; mx = query(1, 0, n - 1, 0, n - 1); for (ll i = 0; i < n; ++i) { for (ll j = i ; j < n; ++j) { //cout << i << " " << j << " " << query(1, 0, n - 1, i, j) << " " << (j - i + 1) << '\n'; if (i == 0 and j == n - 1) continue; ans = (ans + query(1, 0, n - 1, i, j) * (j - i + 1)) % MOD; } } ans = (ans + mx * max(1LL, ((n - 1) * (n - 1) * (n - 1) + 3 * (n - 1)))) % MOD; ll k = 3; for (ll i = 1; i < n - 2; ++i) { ll m = query(1, 0, n - 1, 0, i); for (ll j = k; j < n; ++j) { //cout << "0:" << i << " " << j << ":" << n - 1 << '\n'; ans = (ans + query(1, 0, n - 1, j, n - 1)) % MOD; } ++k; } cout << ans << '\n'; return 0; }