#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #define REP(i,n) for ((i)=0; (i) < (n); (i)++ ) #define REPS(i,s,n) for ((i)=(s); (i) < (n); (i)++ ) #define MAX(A,B) (((A)>(B))?(A):(B)) #define MIN(A,B) (((A)<(B))?(A):(B)) #define SGN(N) (((N)<0)?(-1):(1)) typedef long long ll; const ll MOD = 1e9 + 7; using namespace std; /*----------------------------------------------------------------------------*/ // N^2 solution to check idea for correctness ll SS(vector &a) { int i, j; int n = a.size(); ll ret = 0; ll sets = 0; ll add, max_a, max_max_a; max_max_a = a[0]; REP(i, n) { //for every starting number. ll max_a = a[i]; REPS(j,i,n) { if (a[j] > max_a) max_a = a[j]; if (max_a > max_max_a) max_max_a = max_a; //for every ending number add = max_a*(j - i + 1) % MOD; sets += (j - i + 1); ret = (ret + add) % MOD; } } n = (n*(n + 1)) / 2; n = (n*(n + 1)) / 2; ret += max_max_a * (n - sets) % MOD; return ret; } int main() { int n,i; cin >> n; vector arr(n); REP(i, n) cin >> arr[i]; cout << SS(arr) << endl; }