#include #define fi first #define se second #define FIN "max-transform.inp" #define FON "max-transform.out" using namespace std; typedef pair ii; const int MOD = 1e9+7; const int N = 2e5; int n,a[N+1],ftail[N+1]; inline int sum(long long l,long long r) { return ((r+l)*(r-l+1) >> 1) % MOD; } inline int sum2(int n) { return (long long)n*(n+1)*((n<<1)+1)/6 % MOD; } void init(int n) { ftail[1] = 1; for(int i=2; i<=n; ++i) ftail[i] = (ftail[i-1] + sum(1,i)) % MOD; } void solve(int &res, int val,int l,int mid,int r) { //cout << val << ' ' << l << ' ' << mid << ' ' << r << endl; int d1 = mid-l, d2 = r-mid; if (d1 > d2) swap(d1, d2); (res += (long long)sum2(d1) * val % MOD) %= MOD; if (d2 > d1) (res += (long long)sum(d1+1, d2)*d1 % MOD * val % MOD) %= MOD; if (d2 < r-l-1) { int tmp = (ftail[r-l-1] - ftail[d2] - (long long)sum(1,d2)*(r-l-1-d2)) % MOD; if (tmp < 0) tmp += MOD; (res += (long long)tmp * val %MOD) %= MOD; } //cout << res << endl; } void phase1(int &res) { ii b[N+1]; for(int i=1; i<=n; ++i) b[i] = ii(a[i], i); sort(b+1, b+n+1); set sright; for(int i=1; i<=n; ++i) sright.insert(i); set::iterator ite; for(int i=1,l,r; i<=n; ++i) { sright.erase(b[i].se); ite = sright.upper_bound(b[i].se); r = ite==sright.end() ? n+1 : *ite; if (sright.size() > 0 && ite!=sright.begin()) { --ite; l = *ite; } else l = 0; solve(res, b[i].fi, l, b[i].se, r); } } int get(int pre, int cur, int mid) { if (mid <= pre) return sum(n-cur+1, n-pre); return (sum(n-cur+1, n-mid+1) + (long long)(n-mid+1)*(mid-pre-1)) % MOD; } void phase2(int &res) { if (n<2) return; int stk[N+1], top = 0, head = a[1], sleft=0, sright=0, mid = n, pm; stk[0] = 0; for(int i=2; i<=n; ++i) if (a[i] > head) { while (top > 0 && a[stk[top]] <= a[i]) --top; stk[++top] = i; } for(int i=1; i<=top; ++i) (sleft += (long long)a[stk[i]]*(stk[i]-stk[i-1]) % MOD) %= MOD; pm = top+1; for(int i=2; i<=n; ++i,--mid) { if (pm > top+1) pm = top+1; if (stk[pm-1] >= mid) { (sright += (long long)a[stk[pm-1]]*(stk[pm-1]-stk[pm-2]) % MOD * (n-mid+1) % MOD) %= MOD; (sleft -= (long long)a[stk[pm-1]]*(stk[pm-1]-stk[pm-2]) % MOD) %= MOD; if (sleft < 0) sleft += MOD; --pm; } else if (pm<=top) { (sright += (long long)a[stk[pm]]*(mid-stk[pm-1]) % MOD) %= MOD; } head = max(head, a[i]); while (top>0 && a[stk[top]]<=head) { if (stk[top]1; --i) (cnt += (long long)i*(i-1) % MOD) %= MOD; int m = (long long)n*(n+1)/2 % MOD; cnt = ((long long)m*(m+1)/2 - cnt) % MOD; (res += (long long)*max_element(a+1,a+n+1)*cnt % MOD) %= MOD; } int main() { //freopen(FIN,"r",stdin); // freopen(FON,"w",stdout); ios_base::sync_with_stdio(0); cin >> n; for(int i=1; i<=n; ++i) cin >> a[i]; init(n); int res = 0; phase1(res); phase2(res); phase3(res); cout << res; }