同POJ3468,区间加+区间求和.
我写的是用树状数组维护差分序列实现区间修改的版本.
AC code:
#include <cstdio>
typedef long long ll;
const ll N=1000010;
ll n,q;
ll d[N],id[N];
void add(ll x[],ll p,ll k){
for(ll i=p;i<=n;i+=i&-i) x[i]+=k;
}
ll getsum(ll x[],ll p){
ll sum=0;
for(ll i=p;i;i-=i&-i) sum+=x[i];
return sum;
}
ll get(ll p){
return (p+1)*getsum(d,p)-getsum(id,p);
}
int main(){
scanf("%lld%lld",&n,&q);
for(ll i=1;i<=n;i++){
ll t;
scanf("%lld",&t);
add(d,i,t);add(d,i+1,-t);
add(id,i,t*i);add(id,i+1,-t*(i+1));
}
for(int i=1;i<=q;i++){
char c;
ll L,R,k;
scanf("\n%c",&c);
if(c=='Q'){
scanf("%lld%lld",&L,&R);
printf("%lld\n",get(R)-get(L-1));
}
else{
scanf("%lld%lld%lld",&L,&R,&k);
add(d,L,k);add(id,L,k*L);add(d,R+1,-k);add(id,R+1,-k*(R+1));
}
}
return 0;
}