注意在查询的时候还要进行更新。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#define LL long long
#define inf 0x3f3f3f3f
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
LL n,sum[1000100],la[1000100];
using namespace std;
void up(LL rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(LL rt,LL len)
{
if(la[rt])
{
la[rt<<1]+=la[rt];
la[rt<<1|1]+=la[rt];
sum[rt<<1]+=la[rt]*(len-(len>>1));
sum[rt<<1|1]+=la[rt]*(len>>1);
la[rt]=0;
}
}
void bu(LL l,LL r,LL rt)
{
la[rt]=0;
if(l==r)
{
scanf("%lld",&sum[rt]);
return ;
}
LL mid=(l+r)>>1;
bu(ls);
bu(rs);
up(rt);
}
void ch(LL a,LL b,LL c,LL l,LL r,LL rt)
{
if(a<=l&&r<=b)
{
la[rt]+=c;
sum[rt]+=(r-l+1)*c;
return ;
}
pushdown(rt,r-l+1);
LL mid=(l+r)>>1;
if(a<=mid)
ch(a,b,c,ls);
if(b>mid)
ch(a,b,c,rs);
up(rt);
}
LL Q(LL a,LL b,LL l,LL r,LL rt)
{
if(a<=l&&r<=b)
{
return sum[rt];
}
pushdown(rt,r-l+1);
LL mid=(l+r)>>1;
LL s=0;
if(a<=mid)
s+=Q(a,b,ls);
if(mid<b)
s+=Q(a,b,rs);
return s;
}
int main()
{
LL m,i,j,cla,a,b,c;char st[10];
scanf("%lld%lld",&n,&m);
getchar();
bu(1,n,1);
while(m--)
{
scanf("%s",&st);
if( !strcmp( st,"Q" ) )
{
scanf("%lld%lld",&a,&b);
LL p=Q(a,b,1,n,1);
printf("%lld\n",p);
}
else if(!strcmp(st,"C") )
{
scanf("%lld%lld%lld",&a,&b,&c);
ch(a,b,c,1,n,1);
}
}
return 0;
}