#include <cmath> #include <cstdio> #include <vector> #include "deque" #include <iostream> #include <algorithm> using namespace std; int n; vector<int> SA(vector<int>arr){ vector<int>ret; for(int k = 1; k <= n; k++){ deque<int>dq(k); for(int j = 0; j < k; j++){ while((!dq.empty()) && arr[j] >= arr[dq.back()]) dq.pop_back(); dq.push_back(j); } for(int i = k; i < n; i++){ ret.push_back(arr[dq.front()]); while((!dq.empty()) && arr[i] >= arr[dq.back()]) dq.pop_back(); while((!dq.empty()) && dq.front() <= i-k) dq.pop_front(); dq.push_back(i); } ret.push_back(arr[dq.front()]); } return ret; } int tb[23][8002005]; int sv[8002005]; const int mod = 1e9 + 7; int qry(int l, int r){ int k = sv[r-l+1]; return max(tb[k][l], tb[k][r-1-(1<<k)]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; vector<int>a(n); for(int i = 0; i < n; i++) cin >> a[i]; a = SA(a); n = n * (n + 1) / 2; for(int i = 0; i < n; i++){ tb[0][i] = a[i]; } for(int i = 0; (1<<i) <= n; i++) sv[1<<i]=i; for(int i = 2; i <= n; i++)if(!sv[i])sv[i]=sv[i-1]; for(int j = 1; j < 23; j++){ for(int i = 0; i + (1<<(j-1)) < n; i++) tb[j][i] = max(tb[j-1][i], tb[j-1][i+(1<<(j-1))]); } int ans = 0; for(int i = 0; i < n; i++){ int lo = 0, hi = i; while(lo < hi){ int md = lo + (hi - lo) / 2; if(md == i || qry(md,i-1) < a[i]) hi = md; else lo = md + 1; } int lft = lo; lo = i, hi = n - 1; while(lo < hi){ int md = lo + (hi - lo + 1)/2; if(qry(i,md) == a[i]) lo = md; else hi = md - 1; } int rt = lo; ans = (ans + ((rt-i+1) * 1ll * (i-lft + 1)) * 1ll * a[i])%mod; } cout << ans << '\n'; return 0; }