#include #include #include using namespace atcoder; using namespace std; #define rep(i,n) for (int i = 0; i < (n); ++i) #define Inf 1000000001 vector A; struct Data{ long long v = 0; long long sz = 0; }; Data op(Data a,Data b){ a.v += b.v; a.sz += b.sz; return a; } Data e(){ return Data(); } Data mapping(long long a,Data b){ if(a==-1)return b; b.v = a * b.sz; return b; } long long composition(long long a,long long b){ if(a==-1)return b; if(b==-1)return a; return a; } long long id(){ return -1; } int main(){ int N; cin>>N; A.resize(N); rep(i,N){ scanf("%d",&A[i]); } vector Nxt(N+1,N); vector nxt(N); for(int i=N-1;i>=0;i--){ nxt[i] = Nxt[A[i]]; Nxt[A[i]] = i; } vector mexs(N); set S; map mp; for(int i=1;i<=N+1;i++){ S.insert(i); } rep(i,N){ mp[A[i]]++; S.erase(A[i]); mexs[i].v = (*S.begin()); mexs[i].sz = 1; } lazy_segtree seg(mexs); long long ans = 0LL; rep(i,N){ ans += seg.prod(i,N).v; //cout<1){ int mid = (ok+ng)/2; if(seg.get(mid).v >= A[i])ok = mid; else ng= mid; } seg.apply(ok,nxt[i],A[i]); } cout<