暂定。。。
#include <bits/stdc++.h> using namespace std; const int maxn=111111; int add[maxn<<2],sum[maxn<<2]; int a[maxn]; int ans=0; int op,l,r,x,k,n,m; #define lson (rt<<1) #define rson (rt<<1|1) void Pushup(int rt) { int tmp=sum[rt]; sum[rt]=sum[lson]+sum[rson]; if(sum[rt]>k&&tmp<=k) ans++; if(sum[rt]<=k&&tmp>k) ans--; } void Pushdown(int rt,int l,int r) { if(add[rt]) { int mid=(l+r)>>1; add[lson]+=add[rt]; add[rson]+=add[rt]; int tmp=sum[lson]; sum[lson]+=add[rt]*(mid-l+1); if(tmp<=k&&sum[lson]>k) ans++; if(tmp>k&&sum[lson]<=k) ans--; tmp=sum[rson]; sum[rson]+=add[rt]*(mid-l+1); if(tmp<=k&&sum[rson]>k) ans++; if(tmp>k&&sum[rson]<=k) ans--; add[rt]=0; } } void Build(int rt,int l,int r) { if(l==r) { sum[rt]=a[l]; if(sum[rt]>k) ans++; return ; } int mid=(l+r)>>1; Build(lson,l,mid); Build(rson,mid+1,r); Pushup(rt); } void update(int rt,int l,int r,int ql,int qr,int v) { if(ql<=l&&r<=qr) { int tmp=sum[rt]; sum[rt]+=v*(r-l+1); if(tmp<=k&&sum[rt]>k) ans++; if(tmp>k&&sum[rt]<=k) ans--; add[rt]+=v; return; } int mid=(l+r)>>1; Pushdown(rt,l,r); if(ql<=mid) update(lson,l,mid,ql,qr,v); if(qr>mid) update(rson,mid+1,r,ql,qr,v); Pushup(rt); } int main() { memset(add,0,sizeof(add)); memset(sum,0,sizeof(sum)); memset(a,0,sizeof(a)); scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Build(1,1,n); for(int i=1;i<=m;i++) { scanf("%d %d %d %d",&op,&l,&r,&x); if(op==1) { update(1,1,n,l,r,x); printf("%d\n",ans); } else { update(1,1,n,l,r,-x); printf("%d\n",ans); } } return 0; }