线段树模板题。
线段树
数据用long long
#include<cstdio>
using namespace std;
int n,m;
int b,c,d;
long long int num;
struct node{
long long int l,r,w,f;
}tree[400001];
void build(int k,int ll,int rr){
tree[k].l=ll,tree[k].r=rr;
if(tree[k].l==tree[k].r){
scanf("%lld",&tree[k].w);
return;
}
int m=(ll+rr)/2;
build(k*2,ll,m);
build(k*2+1,m+1,rr);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void down(int k){
tree[k*2].f+=tree[k].f;
tree[k*2+1].f+=tree[k].f;
tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
tree[k].f=0;
}
void find(int k){
if(tree[k].l>=b&&tree[k].r<=c){
num+=tree[k].w;
return;
}
if(tree[k].f) down(k);
int m=(tree[k].l+tree[k].r)/2;
if(b<=m) find(k*2);
if(c>m) find(k*2+1);
}
void amend(int k){
if(tree[k].l>=b&&tree[k].r<=c){
tree[k].w+=(tree[k].r-tree[k].l+1)*d;
tree[k].f+=d;
return;
}
if(tree[k].f) down(k);
int m=(tree[k].l+tree[k].r)/2;
if(b<=m) amend(k*2);
if(c>m) amend(k*2+1);
tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
int main()
{
scanf("%d %d",&n,&m);
build(1,1,n);
for(int i=1;i<=m;i++){
char a;
num=0;
getchar();
scanf("%c",&a);
if(a=='Q'){
scanf("%d %d",&b,&c);
find(1);
printf("%lld\n",num);
}
else{
scanf("%d %d %d",&b,&c,&d);
amend(1);
}
}
}