#include using namespace std; using ll=long long; #define int ll #define rng(i,a,b) for(int i=int(a);i=int(a);i--) #define per(i,b) gnr(i,0,b) #define pb push_back #define eb emplace_back #define a first #define b second #define bg begin() #define ed end() #define all(x) x.bg,x.ed #ifdef LOCAL #define dmp(x) cerr<<__LINE__<<" "<<#x<<" "< void chmax(t&a,u b){if(a void chmin(t&a,u b){if(b using vc=vector; template using vvc=vc>; using pi=pair; using vi=vc; template ostream& operator<<(ostream& os,const pair& p){ return os<<"{"< ostream& operator<<(ostream& os,const vc& v){ os<<"{"; for(auto e:v)os< void dmpr(ostream&os,const T&t,const Args&... args){ os< ostream& operator<<(ostream&os,const array&a){ return os<(all(a)); } template void print_tuple(ostream&,const T&){ } template void print_tuple(ostream&os,const T&t){ if(i)os<<","; os<(t); print_tuple(os,t); } template ostream& operator<<(ostream&os,const tuple&t){ os<<"{"; print_tuple<0,tuple,Args...>(os,t); return os<<"}"; } void print(ll x,int suc=1){ cout<>i; return i; } vi readvi(int n,int off=0){ vi v(n); rep(i,n)v[i]=read()+off; return v; } template void print(const vector&v,int suc=1){ rep(i,v.size()) print(v[i],i==int(v.size())-1?suc:2); } string readString(){ string s; cin>>s; return s; } template T sq(const T& t){ return t*t; } //#define CAPITAL void yes(bool ex=true){ #ifdef CAPITAL cout<<"YES"< void mkuni(vc&v){ sort(all(v)); v.erase(unique(all(v)),v.ed); } ll rand_int(ll l, ll r) { //[l, r] #ifdef LOCAL static mt19937_64 gen; #else static random_device rd; static mt19937_64 gen(rd()); #endif return uniform_int_distribution(l, r)(gen); } template int lwb(const vc&v,const t&a){ return lower_bound(all(v),a)-v.bg; } //b==e のクエリを投げるかどうか気をつける //b==e 投げても問題ない? //なんかバグったら考えよう //KUPC2017I //HDU 5306 Gorgeous Sequence template struct segbeats{ vc x; int s; segbeats(){} template segbeats(const vc& a){ int n=a.size(); s=1; while(s void chr(int l,int r,int i,int b,int e,F f,Args&&... args){ if(e<=l||r<=b) return; if(b<=l&&r<=e&&(x[i].*f)(forward(args)...)) return; push(i); int m=(l+r)/2; chr(l,m,i*2,b,e,f,forward(args)...); chr(m,r,i*2+1,b,e,f,forward(args)...); upd(i); } template void ch(int b,int e,F f,Args&&... args){ assert(b<=e); chr(0,s,1,b,e,f,forward(args)...); } //use decltype((declval().*F())()) for old-fashioned judges template auto getr(int l,int r,int i,int b,int e,F f,G g,H h){ if(e<=l||r<=b) return h; if(b<=l&&r<=e) return (x[i].*f)(); push(i); int m=(l+r)/2; return g(getr(l,m,i*2,b,e,f,g,h),getr(m,r,i*2+1,b,e,f,g,h)); } template auto get(int b,int e,F f,G g,H h){ assert(b<=e); return getr(0,s,1,b,e,f,g,h); } //return minimum index template pair findr(int i,int l,int r,int b,int e,F f,Args&&...args){ if(e<=l||r<=b)return {e,N()}; if(b<=l&&r<=e){ if(!(x[i].*f)(forward(args)...))return {e,N()}; if(r-l==1)return {l,x[i]}; } push(i); int m=(l+r)/2; auto a=findr(i*2,l,m,b,e,f,forward(args)...); if(a.a(args)...); } //NOT VERIFIED template pair find(int b,int e,F f,Args&&...args){ assert(b<=e); return findr(1,0,s,b,e,f,forward(args)...); } //NOT VERIFIED /* //return maximum index template pair findr(int i,int l,int r,int b,int e,F f,Args&&...args){ if(e<=l||r<=b)return {b-1,N()}; if(b<=l&&r<=e){ if(!(x[i].*f)(args...))return {b-1,N()}; if(r-l==1)return {l,x[i]}; } push(i); int m=(l+r)/2; auto a=findr(i*2+1,m,r,b,e,f,forward(args)...); if(a.a>=b)return a; return findr(i*2,l,m,b,e,f,forward(args)...); } template pair find(int b,int e,F f,Args&&...args){ assert(b<=e); return findr(1,0,s,b,e,f,forward(args)...); } */ void enumerater(int l,int r,int i,int b,int e,vc&dst){ if(e<=l||r<=b) return; if(l+1==r){ dst.pb(x[i]); return; } push(i); int m=(l+r)/2; enumerater(l,m,i*2,b,e,dst); enumerater(m,r,i*2+1,b,e,dst); } void enumerate(int b,int e,vc&dst){ assert(b<=e); return enumerater(0,s,1,b,e,dst); } }; //usage //range add linear function to range //don't forget to pass the second argument to addA struct N{ int s,len,la,lb; N(int v=0,int w=1):s(v),len(w),la(0),lb(0){} bool addA(int v,int&d){ la+=v; s+=len*(len-1)/2*v; addB(d*v); d+=len; return true; } bool addB(int v){ lb+=v; s+=len*v; return true; } void push(N&x,N&y){ int tmp=0; x.addA(la,tmp); y.addA(la,tmp); x.addB(lb); y.addB(lb); la=0; lb=0; } static N merge(N x,N y){ return N(x.s+y.s,x.len+y.len); } int gets(){return s;} }; int slv(int n,vi p,segbeats&seg){ if(p.empty())return 0; int ans=0; int cur=n; vi qs; { int pre=0; for(auto i:p){ if(pre> his; auto addA=[&](int l,int r){ dmp2(l,r); his.eb(0,l,r); int tmp=0; seg.ch(l,r,&N::addA,1,tmp); }; auto addB=[&](int v,int l,int r){ dmp2(v,l,r); assert(v>0); his.eb(v,l,r); seg.ch(l,r,&N::addB,v); }; addB(1,cur+1,seg.s); auto getSum=[&](int l,int r){ dmp2(l,r); return seg.get(l,r,&N::gets,[](int a,int b){return a+b;},int(0)); }; dmp(qs); for(auto q:qs){ if(q<0){ ans+=getSum(cur+q,cur); addA(cur+q,cur); addB(-q,cur,seg.s); }else{ ans+=getSum(cur+1,cur+2); addB(1,cur+2,seg.s); } dmp(ans); cur+=q; } for(auto h:his){ int v,l,r;tie(v,l,r)=h; if(v==0){ int tmp=0; seg.ch(l,r,&N::addA,-1,tmp); }else{ seg.ch(l,r,&N::addB,-v); } } dmp2(p,ans); return ans; } signed main(){ cin.tie(0); ios::sync_with_stdio(0); cout<>n; const int V=ten(5); vvc pos(V); rep(i,n){ int x;cin>>x; x--; pos[x].pb(i); } segbeats seg(vi(2*n+1)); int ans=0; rep(i,V)ans+=slv(n,pos[i],seg); cout<