#include using namespace std; #define mod 1000000007 #define N 1000001 #define M 201000 int lef[M], righ[M], a[M], mx[M], fir[M], sec[M]; int f[N * 2]; typedef long long ll; int calc(int x, int type) { int ans = f[x]; while(x) { x -= x&-x; if(x == 0) break; if(type == 0) { ans = max(ans, f[x]); } else { ans = min(ans, f[x]); } } return ans; } void add(int val, int pos) { while(pos < N) { f[pos] = val; pos += pos&-pos; } } int main() { //freopen("1.in", "r", stdin); int n; scanf("%d", &n); for(int i = 0; i < N; i ++) f[i] = 0; for(int i = 1; i <= n; i ++) scanf("%d", &a[i]); for(int i = 1; i <= n; i ++) { lef[i] = calc(N - a[i], 0) + 1; add(i, N - a[i]); } for(int i = 1; i <= n; i ++) { sec[i] = calc(N - a[i], 0) + 1; } for(int i = 0; i < N; i ++) f[i] = n + 1; for(int i = n; i >= 1; i --) { righ[i] = calc(N - a[i] - 1, 1) - 1; add(i, N - a[i]); } for(int i = 1; i <= n; i ++) { fir[i] = calc(N - a[i] - 1, 1) - 1; } mx[n] = a[n]; for(int i = n - 1; i >= 1; i --) mx[i] = max(mx[i + 1], a[i]); ll ans = 0; ll cnt = 1ll * n * (n + 1) / 2 % mod; cnt = 1ll * cnt * (cnt + 1) / 2 % mod; for(int i = 1; i <= n; i ++) if(a[i] != mx[1]) { ll ans1 = 0; if(lef[i] < 0 || righ[i] > n || lef[i] > i || righ[i] < i) { while(true) {} } ans1 = 1ll * (righ[i] - i + 1) * (righ[i] - lef[i] + 2) % mod * (i - lef[i] + 1) % mod; if(ans1 % 2 == 0) ans1 /= 2; else ans1 = (ans1 + mod) / 2; //printf("%d %I64d %d %d\n", a[i], ans1, lef[i], righ[i]); //ll ans2 = 1ll * (i - lef[i] + 1) * (i + lef[i]) / 2 % mod * (righ[i] - i + 1) % mod; //ans1 -= ans2; //if(ans1 < 0) ans1 += mod; cnt -= ans1; if(cnt < 0) cnt += mod; ans = ans + 1ll * ans1 * a[i] % mod; if(ans >= mod) ans -= mod; } for(int i = n; i >= 1; i --) if(a[i] != mx[1] && a[i] == mx[i] && fir[i] >= 2) { ll ans1 = 0; for(int j = lef[i]; j <= i; j ++) { if(fir[i] - 1 <= n - j + 1) { ans1 += 1ll * fir[i] * (fir[i] - 1) / 2 % mod; if(ans1 >= mod) ans1 -= mod; } else { ans1 += 1ll * (n - j + 1) * (fir[i] - n + j - 1) % mod; if(ans1 >= mod) ans1 -= mod; ans1 += 1ll * (n - j + 1) * (n - j) / 2 % mod; if(ans1 >= mod) ans1 -= mod; } } //printf("%d %I64d\n", a[i], ans1); cnt -= ans1; //printf("%d %I64d\n", a[i], ans1); if(cnt < 0) cnt += mod; ans = ans + 1ll * ans1 * a[i] % mod; if(ans >= mod) ans -= mod; } int mx_val = mx[1]; mx[1] = a[1]; for(int i = 2; i <= n; i ++) mx[i] = max(mx[i - 1], a[i]); for(int i = 1; i <= n; i ++) if(mx[i] == a[i] && a[i] != mx_val && sec[i] != n + 1 && mx[i] != mx[i - 1]) { ll ans1 = 0; for(int j = i; j <= righ[i]; j ++) { if(j - 1 >= n - sec[i] + 1) { ans1 += 1ll * (n - sec[i] + 1) * (n - sec[i] + 2) / 2 % mod; if(ans1 >= mod) ans1 -= mod; } else { ans1 += 1ll * (j - 1) * (n - j + 2 - sec[i]) % mod; if(ans1 >= mod) ans1 -= mod; ans1 += 1ll * (j - 1) * j / 2 % mod; if(ans1 >= mod) ans1 -= mod; } } cnt -= ans1; if(cnt < 0) cnt += mod; ans = ans + 1ll * a[i] * ans1 % mod; if(ans >= mod) ans -= mod; } ans = ans + 1ll * mx_val * cnt % mod; ans %= mod; if(ans < 0) ans += mod; //printf("%I64d %I64d\n", ans, cnt); printf("%lld\n", ans); }