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