#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; using ll=long long; typedef pair P; template struct BIT{ vector bit; int size; BIT(int n):size(n), bit(n+1, 0){} T sum(int i){ //[0, i) T s=0; while(i>0){ s+=bit[i]; i-=(i&(-i)); } return s; } T sum(int l, int r){ //[l, r) return sum(r)-sum(l); } void add(int i, T x){ i++; while(i<=size){ bit[i]+=x; i+=(i&(-i)); } } }; 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], r-l); if(k vq[500]; int ans[20020]; int main() { cin>>n>>q; for(int i=0; i>a[i]; a[i]--; } for(int i=0; i>l[i]>>r[i]; l[i]--; vq[l[i]/d].push_back(i); } auto f=[&](int x, int y){ return min(x, y);}; auto g=[&](int a, int x, int len){ return a+x; }; auto h=[&](int x, int y){ return x+y; }; const int INF=1e9; vector v0(n); for(int i=0; i<=(n-1)/d; i++){ if(vq[i].empty()) continue; sort(vq[i].begin(), vq[i].end(), [&](int x, int y){ return r[x]>r[y];}); BIT bit1(n), bit2(n), bit(n); LazySegmentTree seg(n, f, g, h, INF, 0); seg.build(v0); int s=0; for(int j=0; jr[k]){ r1--; seg.update(a[r1]+1, n, 1); s+=bit1.sum(a[r1]+1, n); s+=bit2.sum(a[r1]); bit2.add(a[r1], 1); } if(l1l[k]){ while(l1>l[k]){ l1--; seg.update(a[l1], n, 1); bit1.add(a[l1], -1); s-=bit1.sum(a[l1]+1, n); s-=bit2.sum(a[l1]); } } //cout<