#include using namespace std; #define db(x){if(cond)cerr<<__LINE__<<" "<<#x<<" " <=(b);--i) #define all(x) (x).begin(),(x).end() #define vv vector #define pb push_back templatevoid MA(X&a,X b){a=max(a,b);}templatevoid MI(X&a,X b){a=min(a,b);} templatevoid clr(X&x,int a){memset(x,a,sizeof(a));};typedef __int128 ll;typedef long double ld; typedef arrayll2;typedef arrayll3;typedef vvvi;int cond=0,multi=0,gcj=0; const int MAXA=(int)2e6; const int MOD=1e9+7; const int MAXN=4e5; struct solver_t{ ll SUM1[MAXN+2]={}; ll SUM2[MAXN+2]={}; long long N; vi A; vi pos[MAXA+2]; void init(){ fo(i,1,MAXN){ SUM1[i]=SUM2[i]=0; SUM1[i]=(SUM1[i-1]+((ll)i)*(i+1)/2); if(i>=2)SUM2[i]=SUM2[i-2]; SUM2[i]=(SUM2[i]+((ll)i)*(i+1)/2); } } vi f(vi in){ vi out; fo(k,0,(int)in.size()-1){ fo(p,0,(int)in.size()-1-k){ ll max_val=0; fo(i,0,k)max_val=max((long long)max_val,(long long)in[p+i]); out.pb(max_val); } } db(out.size()); return out; } ll brute(){ maptarget_cnt; ll sol=0; vi f2=f(f(A)); for(int i:f2)target_cnt[i]++; for(auto iter:target_cnt)sol=(sol+(long long)iter.first * iter.second)%MOD; for(auto iter:target_cnt)db(iter.first<<" "<>N; //N = 9; A=vi(N); rep(i,N)cin>>A[i]; rep(i,N)pos[A[i]].pb(i); //ll expected=brute(); map odc; rep(i,N)odc[i]={{A[i],0}}; odc[-1]=odc[N]={{(int)2e9,0}}; long long maxA=-1;rep(i,N)maxA=max(maxA,A[i]); __int128 total_count=0; __int128 total_sum=0; fo(i,0,maxA-1){ if(pos[i].size()==0)continue; deque pozi; setppp; for(int p:pos[i])ppp.insert(p); if(odc[0][0]<=i)ppp.insert(0); auto last=odc.end();last--;last--; if(last->second[0]<=i)ppp.insert(last->first); for(int p:ppp){ auto ptr=odc.find(p); if(ptr==odc.end())continue; while(ptr->second[0]<=i)ptr--; ptr++; int p1=ptr->first; ll sub_cnt=ptr->second[1]; while(true){ auto ptr2=ptr;ptr2++; if(ptr2->second[0]<=i){sub_cnt+=ptr2->second[1];odc.erase(ptr2->first);} else break; } ptr++; int p2=ptr->first; pozi.pb({{p1,p2,sub_cnt}}); } //for(auto el:pozi)db(i<<" "<=2&&argv[1][0]=='q'?1<<30:0; cout.setf(ios::fixed),cout.precision(10);int t;if(multi||gcj)cin>>t;else t=1; srand(time(0)); t=1; fo(i,1,t){ solver_t *solver=new solver_t(); solver->init(); solver->solve(); delete solver; }return 0; }