这是线段树吧,表示十分不理解
#include<iostream>
using namespace std;
const int N=1000010;
struct{
int l,r,sum;
}tree[4*N];
void build_tree(int now,int li,int ri){
tree[now].l=li,tree[now].r=ri;
if(li==ri){
scanf("%d",&tree[now].sum);
return ;
}
int mid=(li+ri)/2;
build_tree(now*2+1,li,mid);
build_tree(now*2+2,mid+1,ri);
tree[now].sum=tree[now*2+1].sum+tree[now*2+2].sum;
return ;
}
void insert(int now,int li,int ri,int k){
if(tree[now].l==tree[now].r){
tree[now].sum+=k;
return ;
}
int mid=(tree[now].l+tree[now].r)/2;
if(ri<=mid){
insert(now*2+1,li,ri,k);
}else if(li>mid){
insert(now*2+2,li,ri,k);
}else{
insert(now*2+2,mid+1,ri,k);
insert(now*2+1,li,mid,k);
}
tree[now].sum=tree[now*2+1].sum+tree[now*2+2].sum;
}
int query(int now,int l,int r){
if(l==tree[now].l&&r==tree[now].r) return tree[now].sum;
int mid=(tree[now].l+tree[now].r)/2;
if(r<=mid) return query(now*2+1,l,r);
else if(l>mid) return query(now*2+2,l,r);
else{
return query(now*2+1,l,mid)+query(now*2+2,mid+1,r);
}
}
void print(int now){
cout<<tree[now].l<<' '<<tree[now].r<<' '<<tree[now].sum<<endl;
if(tree[now].l==tree[now].r) return ;
print(now*2+1);
print(now*2+2);
}
int main(){
int n,m;
cin>>n>>m;
build_tree(0,1,n);
while(m--){
int a;
cin>>a;
int l,r;
if(a==1){
int k;
cin>>l>>r>>k;
insert(0,l,r,k);
}else{
cin>>l>>r;
cout<<query(0,l,r)<<endl;
}
}
}