根据 这篇博客 写的区间修改、区间查询
但是样例没过,求调
#include<cstdio>
typedef unsigned long long ULL;
ULL tree1[100005],tree2[100005],n,m,tmp1,tmp2;
inline void update(ULL *TREE,ULL pos,ULL value){
while(pos<=n){
TREE[pos]+=value;
pos+=pos&(-pos);
}
}
inline ULL getsum(ULL *TREE,ULL pos){
ULL sum;
while(pos>0){
sum+=TREE[pos];
pos-=pos&(-pos);
}
return sum;
}
int main(){
scanf("%llu%llu",&n,&m);
for(ULL i=1;i<=n;i++){
scanf("%llu",&tmp1);
tmp2=tmp1-tmp2;
update(tree1,i,tmp2);
update(tree2,i,(i-1)*tmp2);
tmp2=tmp1;
}
ULL opt,x,y,z;
while(m--){
scanf("%llu",&opt);
if(opt==1){
scanf("%llu%llu%llu",&x,&y,&z);
update(tree1,x,z);
update(tree1,y+1,-z);
update(tree2,x,z*(x-1));
update(tree2,y+1,-z*y);
}else{
scanf("%llu%llu",&x,&y);
printf("%llu\n",(y*getsum(tree1,y)-(x-1)*getsum(tree1,x-1))-(getsum(tree2,y)-getsum(tree2,x-1)));
}
}
return 0;
}