#include using namespace std; #include using namespace atcoder; int op(int a,int b){return min(a,b);} int e(){return 1e9;} int tar; bool f(int x){ return x>tar; } const int MAX_N=200009; int main(){ int n;cin>>n; vector a(n);for(auto&e:a)cin>>e,e--; set> st; for(int i=0;i seg(vector(MAX_N,-1)); vector update(MAX_N); for(int i=0;ifirst!=a[i]){ ans+=sum; continue; } idx=(--p)->first; update[idx]=1; } while(update[idx]){ update[idx]=0; tar=seg.get(idx); int next_idx=seg.max_right(idx+1,f); //delete idx<=xfirst>=next_idx)break; if(p!=st.begin()){ auto lp=p,rp=p;lp--;rp++; sum+=long(lp->second-p->second)*(rp->first-p->first); }else{ auto rp=p;rp++; sum-=long(p->second-rp->second)*rp->first; } st.erase(p); } //insert idx auto p=st.lower_bound({idx,-1}); if(p!=st.begin()){ auto lp=p;lp--; sum-=long(lp->second-seg.get(idx))*(p->first-idx); }else{ sum+=long(seg.get(idx)-p->second)*p->first; } st.insert({idx,seg.get(idx)}); if(!update[next_idx])continue; idx=next_idx; } ans+=sum; } ans+=long(n)*(n+1)/2; cout<