#include <iostream>
#define size 100001
using namespace std;
int n,iv[size],seg[size];
void build(int b,int e,int o){
if(b==e) seg[o]=iv[b];
else{
int m=b+(e-b)/2;
build(b,m,o*2),build(m+1,e,o*2+1);
seg[o]=seg[o*2]+seg[o*2+1];
}
}
void change(int l,int r,int c,int b,int e,int o){
if(b>=l&&e<=r) seg[o]+=c;
else{
int m=b+(e-b)/2;
if(l<=m) change(l,r,c,b,m,o*2);
if(r>=m+1) change(l,r,c,m+1,e,o*2+1);
}
}
int rangesum(int l,int r,int b,int e,int o){
if(l<=b&&e<=r) return seg[o];
else{
int m=b+(e-b)/2,ret=0;
if(m>=l) ret+=rangesum(l,r,b,m,o*2);
if(m+1<=r) ret+=rangesum(l,r,m+1,e,o*2+1);
return ret;
}
}
void getpoint(int p,int &r,int b,int e,int o){
if(b==e) r+=seg[o];
else{
int m=b+(e-b)/2;
if(p<=m) getpoint(p,r,b,m,o*2);
else getpoint(p,r,m+1,e,o*2+1);
}
}
int main(){
ios::sync_with_stdio(false);
int m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>iv[i];
build(1,n,1);
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,y,k;
cin>>x>>y>>k;
change(x,y,k,1,n,1);
}else if(op==2){
int x,y,ans=0;
cin>>x>>y;
for(int i=x;i<=y;i++) getpoint(i,ans,1,n,1);
cout<<ans<<endl;
}
}
return 0;
}
在样例输入的情况下,最后一个数输出的是16
求大佬调试