本人蒟蒻

不知为何,POJ这题无论如何都没法过,我的代码如下:
#include<iostream>
using namespace std;
long long n,m,a[100005],sum[400005],add[400005];
void pushup(long long rt)
{
sum[rt]=sum[rt<<1|1]+sum[rt<<1];
}
void pushdown(long long rt,long long len)
{
if(add[rt])
{
sum[rt<<1]+=add[rt]*(len+1>>1),sum[rt<<1|1]+=add[rt]*(len>>1),
add[rt<<1]=add[rt<<1|1]=add[rt];add[rt]=0;
}
}
void build(long long l,long long r,long long rt)
{
if(l==r)
{
sum[rt]=a[l];
return ;
}
long long mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(long long ul,long long ur,long long ad,long long l,long long r,long long rt)
{
if(ul<=l&&ur>=r)
{
sum[rt]+=ad*(r-l+1);
add[rt]+=ad;
return ;
}
long long mid=l+r>>1;
pushdown(rt,r-l+1);
if(ul<=mid)
update(ul,ur,ad,l,mid,rt<<1);
if(ur>mid)
update(ul,ur,ad,mid+1,r,rt<<1|1);
pushup(rt);
}
long long query(long long ql,long long qr,long long l,long long r,long long rt)
{
if(ql<=l&&qr>=r)
return sum[rt];
long long mid=l+r>>1,cnt=0;
pushdown(rt,r-l+1);
if(ql<=mid)
cnt+=query(ql,qr,l,mid,rt<<1);
if(qr>mid)
cnt+=query(ql,qr,mid+1,r,rt<<1|1);
return cnt;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
for(long long i=1;i<=m;i++)
{
char op;long long a,b,c;
cin>>op>>a>>b;
if(op=='C')
{
cin>>c;
update(a,b,c,1,n,1);
}
if(op=='Q')
cout<<query(a,b,1,n,1)<<'\n';
}
return 0;
}
望相助!