mdzz....我的-Wall怕不是被吃了。。。快读里面==写成了=。。。。艹。。。调了一中午、、、QWQ我的时间啊。。。
分块:块内排序加tag(就是偏移量),来二分比所求大的位置;散块暴力修改。。。
#include#include #include #include #include #define R register intusing namespace std;inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;}int n,m,q,T;int a[1000010],s[1000010],pos[1000010],tg[1000010];inline void build(int p) { R l=(p-1)*T+1,r=min(p*T,n); for(R i=l;i<=r;++i) s[i]=a[i]; sort(s+l,s+r+1);}inline int calc(int p,int d) { R l=(p-1)*T+1,r=min(p*T,n); R tmp=lower_bound(s+l,s+r+1,d)-s-1; return r-tmp;}inline void update(int l,int r,int d) { if(pos[l]==pos[r]) for(R i=l;i<=r;++i) a[i]+=d; else { for(R i=l;i<=pos[l]*T;++i) a[i]+=d; for(R i=(pos[r]-1)*T+1;i<=r;++i) a[i]+=d; } pos[l]==pos[r]?build(pos[l]):build(pos[l]),build(pos[r]); for(R i=pos[l]+1;i =d) ++ret;} else { for(R i=l;i<=pos[l]*T;++i) if(a[i]+tg[pos[i]]>=d) ++ret; for(R i=(pos[r]-1)*T+1;i<=r;++i) if(a[i]+tg[pos[i]]>=d) ++ret; } for(R i=pos[l]+1;i
f我再也不能写错快读了。。。2019.04.23