#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; template struct LazySegmentTree{ using F=function; using G=function; using H=function; int sz; vector data; vector lazy; const F f; const G g; const H h; const Monoid e1; const OperatorMonoid e0; LazySegmentTree(int n, const F f, const G g, const H h, const Monoid &e1, const OperatorMonoid &e0): f(f), g(g), h(h), e1(e1), e0(e0){ sz=1; while(sz v){ for(int i=0; i=0; i--) data[i]=f(data[2*i+1], data[2*i+2]); } void eval(int k, int l, int r){ if(lazy[k]!=e0){ data[k]=g(data[k], lazy[k], l, r); if(k>n; int a[100010]; for(int i=0; i>a[i]; } vector v[100010]; for(int i=0; i seg(2*n+1, f, g, h, P(0, 0), 0); for(int i=1; i<=100000; i++){ if(v[i].empty()) continue; v[i].push_back(n+1); int s=n, pr=0; seg.update(n, n+1, 1); for(auto j:v[i]){ P p1=seg.find(s-(j-pr-1)-1, s-1); ans+=-p1.first+p1.second*(s-1); ans+=(j-pr-1)*seg.find(0, s-(j-pr)).second; if(j==n+1) break; seg.update(s-(j-pr-1), s, 1); s=s-(j-pr-1)+1; ans+=seg.find(0, s).second; seg.update(s, s+1, 1); pr=j; } s=n, pr=0; seg.update(n, n+1, -1); for(auto j:v[i]){ if(j==n+1) break; seg.update(s-(j-pr-1), s, -1); s=s-(j-pr-1)+1; seg.update(s, s+1, -1); pr=j; } } cout<