#pragma GCC optimize ("Ofast") #pragma GCC target ("sse4") #include #include #include #include #include using namespace std; const int mod=1000000007,_2=500000004; int N,MX=0,tp,a[200010],i_1[200010],st[200010],mxl[200010],mxr[200010],sxl[200010],sxr[200010]; long long M,CNT,ANS=0; void calc(int w,int x,int y){ if (x>1)%mod; M=(long long)M*(M+1)%mod*_2%mod; CNT=M; for (int i=1;i<=N;i++){ i_1[i]=(i_1[i-1]+i)%mod; } for (int i=1;i<=N;i++){ sxl[i]=max(sxl[i-1],a[i]); } for (int i=N;i;i--){ sxr[i]=max(sxr[i+1],a[i]); } tp=0; for (int i=1;i<=N;i++){ while (tp>0&&a[st[tp]]<=a[i]){ tp--; } if (tp){ mxl[i]=st[tp]+1; } else{ mxl[i]=1; } st[++tp]=i; } tp=0; for (int i=N;i;i--){ while (tp>0&&a[st[tp]]i&&sxr[p]i){ p--; } calcr(g,N-i+1,p-1); } CNT=(CNT%mod+mod)%mod; ANS=(ANS+(long long)CNT*MX)%mod; printf("%lld",ANS); return 0; }