#include #define LIM 203000 #define mod 1000000007 #define ll long long int using namespace std; int tlef[LIM],trig[LIM],lef[LIM],rig[LIM]; int arr[LIM],mm; mapinv; ll po(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b=b>>1; } return ans; } void compress(int n) { int i,c=0,j; mapmp; map::iterator it; for(i=1;i<=n;i++) mp[arr[i]]++; for(it=mp.begin();it!=mp.end();it++) { c+=mp[it->first]; mp[it->first]=c; } vector >vv; for(i=n;i>=1;i--) { mp[arr[i]]--; inv[mp[arr[i]]+1]=arr[i]; arr[i]=mp[arr[i]]+1; mm=max(mm,arr[i]); vv.push_back(make_pair(arr[i],i)); } setind; set::iterator it2; sort(vv.begin(),vv.end()); for(i=n-1;i>=0;i--) { int inn=vv[i].second; it2=ind.lower_bound(inn); if(it2!=ind.end()) { rig[inn]=(*it2); } if(it2!=ind.begin()) { it2--; lef[inn]=*it2; } ind.insert(inn); } } ll ways[LIM],pres[LIM],presf[LIM],sq[LIM]; int main() { int n,i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&arr[i]); for(i=0;i=0;i--) { tlef[i]=min(tlef[i],tlef[i+1]); trig[i]=max(trig[i],trig[i+1]); } for(i=1;i<=n;i++) { int ele=arr[i]; if(ele==mm) { ll ww=((long long int)n*(n+1)/2)%mod,riga=n-i+1,liga=i-1+1,last=0; ww=(ww*(ww+1))%mod; ww=(ww*po(2,mod-2))%mod; ways[ele]=ww; for(int curr=1;curr<=n;curr++) { liga=max(0LL,liga-1); riga=max(0LL,riga-1); ways[ele]=(ways[ele]+mod-(liga*(liga+1)/2)%mod)%mod; ways[ele]=(ways[ele]+mod-(riga*(riga+1)/2)%mod)%mod; ways[ele]=(ways[ele]+mod-(liga*last)%mod)%mod; last=riga; } continue; } long long int l=i-lef[i]-1,r=rig[i]-i-1,_l=0,_r=0; if(lef[i]==0) _l=n-trig[arr[i]+1]; if(rig[i]==n+1) _r=tlef[arr[i]+1]-1; long long int m,tlen=l+r+1,curr=1; ways[ele]=((l+1)*(r+1))%mod; if(_r) ways[ele]=((l+1)*(r+_r))%mod; for(curr=2;curr<=tlen;curr++) { if(curr<=min(l,r)+1) { m=curr; int st=curr,en=min(l,r)+1; ways[ele]=(ways[ele]+(pres[en]-pres[st-1]+mod))%mod; ways[ele]=(ways[ele]+((l+1)*(r+1)%mod)*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+mod-(sq[en]-sq[st-1]+mod)%mod)%mod; curr=en; } else if(curr<=max(l,r)+1) { m=min(l,r)+1; int st=curr,en=max(l,r)+1; if(l==min(l,r)) { ways[ele]=(ways[ele]+((m*(m+1)/2+m*(r+1))%mod*(en-st+1))%mod)%mod; ways[ele]=(ways[ele]+mod-m*(presf[en]-presf[st-1]+mod)%mod)%mod; } else { ways[ele]=(ways[ele]+((m*(m+1)/2+m*(l+1))%mod*(en-st+1))%mod)%mod; ways[ele]=(ways[ele]+mod-m*(presf[en]-presf[st-1]+mod)%mod)%mod; } curr=en; } else { m=tlen-curr+1; int st=1,en=tlen-curr+1; ways[ele]=(ways[ele]+(pres[en]-pres[st-1]+mod)%mod)%mod; curr=tlen; } } if(_l!=0) { for(curr=2;curr<=tlen&&(_l>=(curr-1));curr++) { if(curr<=min(l,r)+1) { m=curr; int st=curr,en=min(min(l,r)+1,_l+1); ways[ele]=(ways[ele]+((_l+2)*(r+1)%mod)*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+mod-(r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod; curr=en; } else if(curr<=max(l,r)+1) { m=min(l,r)+1; int st=curr,en=min(max(l,r)+1,_l+1); ways[ele]=(ways[ele]+(m*(_l+2)%mod)*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+(mod-m*(presf[en]-presf[st-1])%mod)%mod)%mod; if(l==min(l,r)) { ways[ele]=(ways[ele]+(_l+2)*(r+1)%mod*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+sq[en]-sq[st-1]+mod)%mod; ways[ele]=(ways[ele]+mod-(_l+r+3)*(presf[en]-presf[st-1]+mod)%mod)%mod; } curr=en; } else { m=tlen-curr+1; int st=curr,en=min(tlen,_l+1); ways[ele]=(ways[ele]+((ll)(tlen+1)*(_l+2)%mod)*(en-st+1)%mod); ways[ele]=(ways[ele]+(sq[en]-sq[st-1])%mod)%mod; ways[ele]=(ways[ele]+mod-(tlen+_l+3)*(presf[en]-presf[st-1]+mod)%mod)%mod; curr=en; } } } else if(_r!=0) { for(curr=2;curr<=tlen&&(_r>=(curr+1));curr++) { if(curr<=min(l,r)+1) { m=curr; int st=curr,en=min(min(l,r)+1,_r-1); ways[ele]=(ways[ele]+((l+1)*(_r)%mod)*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+mod-(l+1)*(presf[en]-presf[st-1]+mod)%mod)%mod; curr=en; } else if(curr<=max(l,r)+1) { m=min(l,r)+1; int st=curr,en=min(max(l,r)+1,_r-1); ways[ele]=(ways[ele]+(m*(_r)%mod)*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+(mod-m*(presf[en]-presf[st-1])%mod)%mod)%mod; if(r==min(l,r)) { ways[ele]=(ways[ele]+(l+1)*(_r)%mod*(en-st+1)%mod)%mod; ways[ele]=(ways[ele]+sq[en]-sq[st-1]+mod)%mod; ways[ele]=(ways[ele]+mod-(l+_r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod; } curr=en; } else { m=tlen-curr+1; int st=curr,en=min(tlen,_r-1); ways[ele]=(ways[ele]+((ll)(tlen+1)*(_r)%mod)*(en-st+1)%mod); ways[ele]=(ways[ele]+(sq[en]-sq[st-1])%mod)%mod; ways[ele]=(ways[ele]+mod-(tlen+_r+1)*(presf[en]-presf[st-1]+mod)%mod)%mod; curr=en; } } } assert(ways[ele]>=0); } ll ans=0; for(i=0;i