#include #define inf 1000000007 #define ll long long int using namespace std; int n; vector seg1(5000000),lazy1(5000000),seg2(5000000),lazy2(5000000); void build(vector &seg, vector &lazy, int node, int b, int e,vector &v) { if(b == e) { seg[node] = (b+1LL)*v[b]%inf; lazy[node] = 0; //cout<<"b = "<>1; build(seg,lazy,2*node,b,m,v); build(seg,lazy,2*node+1,m+1,e,v); seg[node] = (seg[2*node]+seg[2*node+1])%inf; lazy[node] = 0; // cout<<"b = "< &seg, vector &lazy, int node, int b, int e,int i, int j,ll val) { if(lazy[node]) { seg[node] = ((500000004LL*(e-b+1LL)%inf)*(e+b+2LL)%inf)*lazy[node]%inf; if(b!=e) { lazy[2*node] = lazy[node]; lazy[2*node+1] = lazy[node]; } lazy[node] = 0; } if(b > j || e < i) return; if(b >= i && e <= j) { seg[node] = ((500000004LL*(e-b+1LL)%inf)*(e+b+2LL)%inf)*val%inf; if(b!=e) { lazy[2*node] = val; lazy[2*node+1] = val; } return; } int m = (b+e)>>1; update(seg,lazy,2*node,b,m,i,j,val); update(seg,lazy,2*node+1,m+1,e,i,j,val); seg[node] = (seg[2*node]+seg[2*node+1])%inf; } ll query(vector &seg, vector &lazy, int node, int b, int e,int i, int j) { if(b > j || e < i) return 0; if(lazy[node]) { seg[node] = ((500000004LL*(e-b+1LL)%inf)*(e+b+2LL)%inf)*lazy[node]%inf; if(b!=e) { lazy[2*node] = lazy[node]; lazy[2*node+1] = lazy[node]; } lazy[node] = 0; } if(b >= i && e <= j) return seg[node]; int m = (b+e)>>1; return (query(seg,lazy,2*node,b,m,i,j)+query(seg,lazy,2*node+1,m+1,e,i,j))%inf; } void build1(vector &seg, vector &lazy, int node, int b, int e, vector &v) { if(b == e) { seg[node] = v[b]; lazy[node] = 0; //cout<<"b = "<>1; build1(seg,lazy,2*node,b,m,v); build1(seg,lazy,2*node+1,m+1,e,v); seg[node] = (seg[2*node]+seg[2*node+1])%inf; lazy[node] = 0; //cout<<"b = "< &seg, vector &lazy, int node, int b, int e,int i, int j,ll val) { if(lazy[node]) { seg[node] = (e-b+1LL)*lazy[node]%inf; if(b!=e) { lazy[2*node] = lazy[node]; lazy[2*node+1] = lazy[node]; } lazy[node] = 0; } if(b > j || e < i) return; if(b >= i && e <= j) { seg[node] = (e-b+1LL)*val%inf; if(b!=e) { lazy[2*node] = val; lazy[2*node+1] = val; } return; } int m = (b+e)>>1; update1(seg,lazy,2*node,b,m,i,j,val); update1(seg,lazy,2*node+1,m+1,e,i,j,val); seg[node] = (seg[2*node] + seg[2*node+1])%inf; } ll query1(vector &seg, vector &lazy, int node, int b, int e,int i, int j) { if(b > j || e < i) return 0; if(lazy[node]) { seg[node] = (e-b+1LL)*lazy[node]%inf; if(b!=e) { lazy[2*node] = lazy[node]; lazy[2*node+1] = lazy[node]; } lazy[node] = 0; } if(b >= i && e <= j) return seg[node]; int m = (b+e)>>1; return (query1(seg,lazy,2*node,b,m,i,j)+query1(seg,lazy,2*node+1,m+1,e,i,j))%inf; } int solve(vector A) { ll sum1 = 0, co = 0; if( n > 3) { vector v; ll ma = max(A[n-1],A[0]); for(int i = 1;i < n-2; i++) { ma = max(ma,A[i]); v.push_back(ma); } //cout<<"max array = "; for(int i = 0;i < n-3; i++) cout<::iterator it = v.begin(),jt; for(int i = 0; i < n-3;i++) { ll tsum = 0; tsum = (tsum+query(seg1,lazy1,1,0,n-4,0,min(i,n-4-i)))%inf; ll k = min(i,n-4-i)+1; co = (co + (500000004LL*k%inf)*(k+1LL)%inf)%inf; //cout<<"tsum1 = "< ma) { int h = ((jt = upper_bound(it,v.end(),A[n-2-i])) - v.begin()) - 1; //cout<<"A[n-2-i] = "< s; s.push(n-1); for(int i = n-2; i >= 0; i--) { while(!s.empty() && A[s.top()] < A[i]) s.pop(); if(!s.empty()) r[i] = s.top() - i - 1; else r[i] = n - i - 1; s.push(i); } while(!s.empty()) s.pop(); l[0] = 0; s.push(0); for(int i = 1; i < n; i++) { while(!s.empty() && A[s.top()] <= A[i]) s.pop(); if(!s.empty()) l[i] = i - s.top() -1; else l[i] = i; s.push(i); } // cout<<"r :"; for(int i = 0; i < n; i++) cout<> n; vector a(n); for(int a_i = 0; a_i < n; a_i++) { cin >> a[a_i]; } ll result = solve(a); cout << result << endl; return 0; }