#include<iostream>
using namespace std;
int pre[100005];
struct tree{
int l,r,value,lazy;
}a[400005];
void build(int number,int start,int end){
a[number].l=start;
a[number].r=end;
if(start==end){
a[start].value=pre[start];
return;
}
int mid=(start+end)/2;
build(2*number,start,mid);
build(2*number+1,mid+1,end);
a[number].value=a[number*2].value+a[number*2+1].value;
}
void pushdown(int number){
a[number*2].value+=a[number].lazy*(a[number*2].r-a[number*2].l+1);
a[number*2+1].value+=a[number].lazy*(a[number*2+1].r-a[number*2+1].l+1);
a[number*2].lazy+=a[number].lazy;
a[number*2+1].lazy+=a[number].lazy;
a[number].lazy=0;
}
void change(int number,int start,int end,int plus){
if(start<=a[number].l&&end>=a[number].r){
a[number].value+=plus*(a[number].r-a[number].l+1);
a[number].lazy+=plus;
return;
}
pushdown(number);
if(start<=a[number*2].r)change(number*2,start,end,plus);
if(end>=a[number*2+1].l)change(number*2+1,start,end,plus);
a[number].value=a[number*2].value+a[number*2+1].value;
}
int query(int number,int start,int end){
int sum=0;
if(start<=a[number].l&&end>=a[number].r)return a[number].value;
pushdown(number);
if(start<=a[number*2].r)sum+=query(number*2,start,end);
if(end>=a[number*2+1].l)sum+=query(number*2+1,start,end);
return sum;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>pre[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int flag,x,y,k;
cin>>flag>>x>>y;
if(flag==1){
cin>>k;
change(1,x,y,k);
}
if(flag==2)cout<<query(1,x,y)<<endl;
}
return 0;
}
样例都过不去,哪位大佬帮忙找找错???感激不尽
如果能@我就更好了qwq