Title Description
Portal
Serious the problem of the sub-block.
The whole block hits the add tag, the rest of the violence plus.
Ask when the whole block sort after two points to find, the rest of the violence to find. Code
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <
Vector> #include <cmath> using namespace std;
const int max_n=1e6+5;
const int max_t=1e4+5;
int n,q,t1,t2,l,r,w,c;
int H[max_n],hh[max_n];
int last[max_t],num[max_n],add[max_t];
inline void change (int l,int r,int w) {int lrange,rrange;
if (Num[l]==num[r]) {for (int i=l;i<=r;++i) h[i]+=w;
for (int i=last[num[l]-1]+1;i<=last[num[l]];++i) hh[i]=h[i];
Sort (hh+last[num[l]-1]+1,hh+last[num[l]]+1);
Return
} if (l!=last[num[l]-1]+1) {lrange=num[l]+1;
for (int i=l;i<=last[num[l]];++i) h[i]+=w;
for (int i=last[num[l]-1]+1;i<=last[num[l]];++i) hh[i]=h[i];
Sort (hh+last[num[l]-1]+1,hh+last[num[l]]+1);
} else lrange=num[l];
if (R!=last[num[r]]) {rrange=num[r]-1; for (int i=last[num[r]-1]+1;i<=r;++i) h[i]+=W
for (int i=last[num[r]-1]+1;i<=last[num[r]];++i) hh[i]=h[i];
Sort (hh+last[num[r]-1]+1,hh+last[num[r]]+1);
} else rrange=num[r];
for (int i=lrange;i<=rrange;++i) add[i]+=w;
} inline void Query (int l,int r,int c) {int ans=0;
int lrange,rrange;
if (Num[l]==num[r]) {for (int i=l;i<=r;++i) if (H[i]>=c-add[num[l]]) ans++;
printf ("%d\n", ans);
Return
} if (l!=last[num[l]-1]+1) {lrange=num[l]+1;
for (int i=l;i<=last[num[l]];++i) if (H[i]>=c-add[num[l]]) ans++;
} else lrange=num[l];
if (R!=last[num[r]]) {rrange=num[r]-1;
for (int i=last[num[r]-1]+1;i<=r;++i) if (H[i]>=c-add[num[r]]) ans++;
} else rrange=num[r];
for (int i=lrange;i<=rrange;++i) {if (hh[last[i]]<c-add[i]) continue;
if (Hh[last[i-1]+1]>=c-add[i]) {ans+=last[i]-(last[i-1]+1) +1; COntinue;
} int Loc=lower_bound (hh+last[i-1]+1,hh+last[i]+1,c-add[i])-hh;
if (Hh[loc]<c-add[i]) ++loc;
ans+=last[i]-loc+1;
} printf ("%d\n", ans);
} int main () {scanf ("%d%d", &n,&q);
for (int i=1;i<=n;++i) {scanf ("%d", &h[i]);
Hh[i]=h[i];
} t1= (int) sqrt (n);
if (n%t1==0) t2=n/t1;
else t2=n/t1+1;
for (int i=1;i<=n;++i) if (i%t1==0) num[i]=i/t1;
else num[i]=i/t1+1;
for (int i=1;i<=t2;++i) last[i]=min (i*t1,n);
for (int i=1;i<=t2;++i) sort (hh+last[i-1]+1,hh+last[i]+1);
for (int i=1;i<=q;++i) {char ch=getchar ();
while (ch!= ' M ' &&ch!= ' A ') Ch=getchar ();
if (ch== ' M ') {scanf ("%d%d%d", &l,&r,&w);
if (l>r) swap (L,R);
Change (L,R,W);
} else{scanf ("%d%d%d", &l,&r,&c);
if (l>r) swap (L,R); QueRy (L,R,C); }
}
}
Summary
The details of the chunking must be noted.