暂定。。。
#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;
}