#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MOD = (1e9 + 7); int n; int M[4002][20]; int f(int x,int y){ return log2(y-x+1); } vector<int> max(vector<int> v){ vector<int> ans; for(int l=0;l<v.size();l++){ for(int i=0;i+l<v.size();i++){ int val = f(i,i+l); ans.push_back(max(v[M[i][val]] , v[M[i+l-(1<<val)+1][val]])); } } return ans; } vector<int> A; int left(int x,int pos){ int ans = -1; for(int i=0;i<pos;i++){ if(A[i] >= x) ans = i; } return ans; } int right(int x,int pos){ int ans = A.size(); for(int i=pos+1;i<A.size();i++){ if(A[i]>x) return i; } return ans; } int main(){ cin>>n; A.resize(n); for(int i=0;i<n;i++) cin>>A[i]; for(int i=0;i<n;i++) M[i][0] = i; for(int j=1;(1<<j) <=n ;j++){ for(int i=0;i+(1<<j)-1 < n;i++){ if(A[M[i][j-1]] > A[M[i+(1<<(j-1))][j-1]]) M[i][j] = M[i][j-1]; else M[i][j] = M[i+(1<<(j-1))][j-1]; } } A = max(A); ll ans = 0; for(int i=0;i<A.size();i++){ ans += ((A[i]*(i-left(A[i],i)))%MOD)*(right(A[i],i)-i); ans %=MOD; } cout<<ans<<endl; return 0; }