/***
10
1 5 4 9 3 5 1 6 8 1 20
***/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MOD (1000000007ll)
#define mod(x) ((((x)%MOD)+MOD)%MOD)
ll CAL(ll n)
{
	return mod(mod(2 * mod(mod(n * n) * mod(n * n)) + 4 * mod(n * n) + 8 * n + (n % 2 ? 1 : -1) + 1) * 562500004);
}
void NGE(ll a[], ll n, ll N[])
{
	vector<pair<ll, ll>>X;
	for (ll i = n - 1; i >= 0; i--)
	{
		while (!X.empty() && X.back().first <= a[i])
			X.pop_back();
		if (X.empty())
			N[i] = n;
		else
			N[i] = X.back().second;
		X.push_back(make_pair(a[i], i));
	}
}
void PGE(ll a[], ll n, ll N[])
{
	vector<pair<ll, ll>>X;
	for (ll i = 0; i < n; i++)
	{
		while (!X.empty() && X.back().first < a[i])
			X.pop_back();
		if (X.empty())
			N[i] = -1;
		else
			N[i] = X.back().second;
		X.push_back(make_pair(a[i], i));
	}
}
ll f(ll a, ll b)
{
	return mod(mod(mod(a + 1) * mod(b + 1)) * mod(mod(a + b + 2) * 500000004));
}
ll sum(ll a[], ll n)
{
	ll PR[n];
	ll NE[n];
	PGE(a, n, PR);
	NGE(a, n, NE);
	ll ans = 0;
	for (ll i = 0; i < n; i++)
	{
		ans = mod(ans + a[i] * f(i - PR[i] - 1, NE[i] - i - 1));
		if (make_pair(PR[i], NE[i]) == make_pair(-1ll, n))
			ans = mod(ans - a[i] * n);
	}
	ll A[n + 2];
	A[0] = 0;
	for (ll i = 1; i <= n; i++)
		A[i] = max(A[i - 1], a[i - 1]);
	ll B[n + 2];
	B[0] = 0;
	for (ll i = 1; i <= n; i++)
		B[i] = max(a[n - i], B[i - 1]);
	A[n + 1] = A[n];
	B[n + 1] = max(B[n + 1], A[n + 1]);
	ll S[n + 2];
	ll Sum[n + 2];
	S[0] = 0;
	Sum[0] = 0;
	for (ll i = 1; i <= n; i++)
	{
		S[i] = mod(S[i - 1] + B[i] * i);
		Sum[i] = mod(Sum[i - 1] + B[i]);
	}
	for (ll t = 2; t < n; t++)
	{
		ll lo = 0;
		ll hi = n + 1;
		while (lo < hi)
		{
			ll k = (lo + hi) / 2;
			if (A[t] <= B[k])
				hi = k;
			else
				lo = k + 1;
		}
		ll i = (lo + hi) / 2;
		ll a = min(t - 1, n - t - 1);
		ll c = min(i - 1, a);
		ans = mod(ans + A[t] * mod(c * (c + 1) / 2));
		if (i <= a)
		{
			ans = mod(ans + S[a]);
			if (i - 1 >= 0)
				ans = mod(ans - S[i - 1]);
		}
		if (t <= n - t - 1)
		{
			ll a = t;
			ll b = n - t - 1;
			if (a <= i && i <= b)
			{
				ans = mod(ans + (t - 1) * mod(Sum[b] - Sum[i - 1]));
				ans = mod(ans + A[t] * mod((i - a) * (t - 1)));
			}
			else if (i < a)
				ans = mod(ans + (t - 1) * mod(Sum[b] - Sum[a - 1]));
			else if (i > b)
				ans = mod(ans + (t - 1) * mod(A[t] * (b - a + 1)));
			if (false)
				for (ll v = a; v <= b; v++)
				{
					ans = mod(ans + max(A[t], B[v]) * (t - 1));
				}
		}
	}
	ll mx = 0;
	for (ll i = 0; i < n; i++)
		mx = max(mx, a[i]);
	ans = mod(ans + mx * CAL(n));
	return ans;
}
int main()
{
	ll n;
	cin >> n;
	ll a[n];
	for (ll i = 0; i < n; i++)
		cin >> a[i];
	cout << sum(a, n);
}