//{ #include using namespace std; typedef long long ll; typedef double lf; typedef pair ii; #define REP(i,n) for(ll i=0;i ostream& operator << (ostream &_s,const pair<_a,_b> &_p){return _s<<"("<<_p.X<<","<<_p.Y<<")";} template ostream& _OUTC(ostream &_s,It _ita,It _itb) { _s<<"{"; for(It _it=_ita;_it!=_itb;_it++) { _s<<(_it==_ita?"":",")<<*_it; } _s<<"}"; return _s; } template ostream &operator << (ostream &_s,vector<_a> &_c){return _OUTC(_s,ALL(_c));} template ostream &operator << (ostream &_s,set<_a> &_c){return _OUTC(_s,ALL(_c));} template ostream &operator << (ostream &_s,map<_a,_b> &_c){return _OUTC(_s,ALL(_c));} template void pary(_t _a,_t _b){_OUTC(cerr,_a,_b);cerr<=MOD)a-=MOD; } ll sn[MAXn],snn[MAXn]; inline ll atob(ll a,ll b){//[a,b] ll rt=sn[b]; sub(rt,sn[max(a-1,0LL)]); return rt; } ll d[MAXn]; ll cal_single(ll n) { ll rt=0,msum=0,cur=0; vector st; st.pb(-1); REP(i,n) { while(SZ(st)>1&&d[i]>=d[st.back()]) { ll t=st.back();st.pop_back(); sub(msum,(t-st.back())*d[t]%MOD); sub(cur,d[t]*atob(i-t,i-st.back()-1)%MOD); } add(msum,d[i]*(i-st.back())%MOD); add(cur,d[i]*atob(1,i-st.back()-1)%MOD); add(cur,msum); add(rt,cur); st.pb(i); } return rt; } ll cal_db(ll n) { for(ll i=n-2;i>=0;i--)d[i]=max(d[i],d[i+1]); for(ll i=n+1;i<2*n;i++)d[i]=max(d[i],d[i-1]); ll rt=0; queue q; ll tt=0,cur=0; for(ll i=3;i<=n;i++) { ll t=n-(i-2); q.push(t); add(tt,(i-2)*d[t]%MOD); while(SZ(q)&&d[q.front()]<=d[n+i-1]) { ll x=q.front();q.pop(); sub(tt,d[x]*(n-x)%MOD); add(cur,(n-x)); } add(rt,tt); add(rt,cur*d[n+i-1]%MOD); } //debug(rt); while(SZ(q))q.pop(); tt=0;cur=0; for(ll i=n-1;i>=0;i--) { if(i){ ll t=n+(n-i); q.push(t); add(tt,d[t]*(n-i)%MOD); } while(SZ(q)&&d[q.front()]<=d[i]) { ll x=q.front();q.pop(); sub(tt,d[x]*(x-n)%MOD); add(cur,x-n); } add(rt,tt); add(rt,cur*d[i]%MOD); } return rt; } vector dt; ll l[MAXn],r[MAXn]; int main() { IOS(); sn[0]=0;snn[0]=0; REP1(i,MAXn-1)sn[i]=sn[i-1],snn[i]=snn[i-1],add(sn[i],i),add(snn[i],i*i%MOD); ll n; cin>>n; REP(i,n)cin>>d[i],d[i+n]=d[i]; ll nnn=n2(n2(n)); REP1(i,n)sub(nnn,(i*(i+1)/2)%MOD); REP1(i,n-1)sub(nnn,i*(i+1)%MOD); //debug(nn,nnn); ll mx=*max_element(d,d+n); ll tri=nnn*mx%MOD,sig=cal_single(n),db=cal_db(n); //debug(sig,db,tri); cout<<(sig+db+tri)%MOD<