#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;
}