#include <bits/stdc++.h>
#include <chrono>
using namespace std;
#define MAX 500
#define mod 1000000007
vector<vector<int>> lookup;
void buildSparseTable(int arr[], int n)
{
for (int i = 0; i < n; i++)
lookup[i][0] = arr[i];
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 0; (i + (1 << j) - 1) < n; i++) {
if (lookup[i][j - 1] > lookup[i + (1 << (j - 1))][j - 1])
lookup[i][j] = lookup[i][j - 1];
else
lookup[i][j] = lookup[i + (1 << (j - 1))][j - 1];
}
}
}
int query(int L, int R)
{
int j = (int)log2(R - L + 1);
if (lookup[L][j] >= lookup[R - (1 << j) + 1][j])
return lookup[L][j];
else
return lookup[R - (1 << j) + 1][j];
}
// Driver program
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
auto start = chrono::high_resolution_clock::now();
int n; cin>>n;
int a[n];
// cout<<n<<'\n'; return 0;
for(int i=0;i<n;i++){
cin>>a[i];
}
int lg=log2(n);
lookup.resize(n);
for(int i=0;i<n;i++){
lookup[i].resize(lg);
}
buildSparseTable(a, n);
int ans=0;
for(int k=1;k<=n;k++){
int l=0,r=k-1;
while(r<n){
ans=(ans+(query(l,r)*k)%mod)%mod;
l++; r++;
}
}
cout<<ans<<'\n';
auto end = chrono::high_resolution_clock::now();
double time_taken =
chrono::duration_cast<chrono::nanoseconds>(end - start).count();
time_taken *= 1e-9;
cout << "Time taken by program is : " << fixed
<< time_taken << setprecision(9);
cout << " sec" << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxjaHJvbm8+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIE1BWCA1MDAKICAjZGVmaW5lIG1vZCAxMDAwMDAwMDA3Cgp2ZWN0b3I8dmVjdG9yPGludD4+IGxvb2t1cDsKICAKdm9pZCBidWlsZFNwYXJzZVRhYmxlKGludCBhcnJbXSwgaW50IG4pCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgIGxvb2t1cFtpXVswXSA9IGFycltpXTsKICAKICAgIGZvciAoaW50IGogPSAxOyAoMSA8PCBqKSA8PSBuOyBqKyspIHsKICAKICAgICAgICAKICAgICAgICBmb3IgKGludCBpID0gMDsgKGkgKyAoMSA8PCBqKSAtIDEpIDwgbjsgaSsrKSB7CiAgCiAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChsb29rdXBbaV1baiAtIDFdID4gbG9va3VwW2kgKyAoMSA8PCAoaiAtIDEpKV1baiAtIDFdKQogICAgICAgICAgICAgICAgbG9va3VwW2ldW2pdID0gbG9va3VwW2ldW2ogLSAxXTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbG9va3VwW2ldW2pdID0gbG9va3VwW2kgKyAoMSA8PCAoaiAtIDEpKV1baiAtIDFdOwogICAgICAgIH0KICAgIH0KfQogIAoKaW50IHF1ZXJ5KGludCBMLCBpbnQgUikKewoKICAgIGludCBqID0gKGludClsb2cyKFIgLSBMICsgMSk7CiAgICAKCiAgICBpZiAobG9va3VwW0xdW2pdID49IGxvb2t1cFtSIC0gKDEgPDwgaikgKyAxXVtqXSkKICAgICAgICByZXR1cm4gbG9va3VwW0xdW2pdOwogIAogICAgZWxzZQogICAgICAgIHJldHVybiBsb29rdXBbUiAtICgxIDw8IGopICsgMV1bal07Cn0KICAKLy8gRHJpdmVyIHByb2dyYW0KaW50IG1haW4oKQp7ICAgICAgCiAgICNpZm5kZWYgT05MSU5FX0pVREdFIAogICBmcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsgCiAgIGZyZW9wZW4oIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7IAogICAjZW5kaWYgIAogICBhdXRvIHN0YXJ0ID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgaW50IG47IGNpbj4+bjsKICAgIGludCBhW25dOwogICAgLy8gY291dDw8bjw8J1xuJzsgcmV0dXJuIDA7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsKICAgICAgICBjaW4+PmFbaV07CiAgICB9CiAgICBpbnQgbGc9bG9nMihuKTsKICAgIGxvb2t1cC5yZXNpemUobik7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXsKICAgICAgICBsb29rdXBbaV0ucmVzaXplKGxnKTsKICAgIH0KICAKICAgIGJ1aWxkU3BhcnNlVGFibGUoYSwgbik7CiAgICBpbnQgYW5zPTA7CiAgICBmb3IoaW50IGs9MTtrPD1uO2srKyl7CiAgICAgICAgaW50IGw9MCxyPWstMTsKICAgICAgICB3aGlsZShyPG4pewogICAgICAgICAgICAKICAgICAgICAgICAgYW5zPShhbnMrKHF1ZXJ5KGwscikqayklbW9kKSVtb2Q7CiAgICAgICAgICAgIGwrKzsgcisrOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQ8PGFuczw8J1xuJzsKICAgIGF1dG8gZW5kID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIGRvdWJsZSB0aW1lX3Rha2VuID0gCiAgICAgIGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om5hbm9zZWNvbmRzPihlbmQgLSBzdGFydCkuY291bnQoKTsKICAKICAgIHRpbWVfdGFrZW4gKj0gMWUtOTsKICAKICAgIGNvdXQgPDwgIlRpbWUgdGFrZW4gYnkgcHJvZ3JhbSBpcyA6ICIgPDwgZml4ZWQgCiAgICAgICAgIDw8IHRpbWVfdGFrZW4gPDwgc2V0cHJlY2lzaW9uKDkpOwogICAgY291dCA8PCAiIHNlYyIgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==