RT
我摊牌了我不会线段树板子
#include<bits/stdc++.h>
using namespace std;
int n,m,tree[400005],a[100005],lazy[400005],sum[400005];
int lson(int qwq){
return qwq*2;
}
int rson(int qwq){
return qwq*2+1;
}
void update(int index){
sum[index]=sum[lson(index)]+sum[rson(index)];
}
void dpd(int index,int l,int r,int z){
lazy[index]+=z;
sum[index]+=z*(r-l+1);
}
void downdate(int index,int l,int r){
int mid=(l+r)/2;
dpd(lson(index),l,mid,lazy[index]);
dpd(rson(index),mid+1,r,lazy[index]);
lazy[index]=0;
}
void buildtree(int index,int l,int r){
lazy[index]=0;
if(l==r){
sum[index]=a[l];
return;
}
int mid=(l+r)/2;
buildtree(lson(index),l,mid);
buildtree(rson(index),mid+1,r);
update(index);
}
int query(int index,int nl,int nr,int cl,int cr){
if(nl>cr)return 998244353;
if(nr<cl)return 998244353;
if(cl<=nl&&cr>=nr)return sum[index];
int mid=(nl+nr)/2;
int msum=0;
if(mid>=cl)msum+=query(lson(index),nl,mid,cl,cr);
if(mid+1<=cr)msum+=query(rson(index),mid+1,nr,cl,cr);
return msum;
}
void upd(int index,int nl,int nr,int cl,int cr,int z){
if(nl>cr||nr<cl)return;
if(cl<=nl&&cr>=nr){
dpd(index,nl,nr,z);
return;
}
downdate(index,nl,nr);
int mid=(nl+nr)/2;
if(mid>=cl)upd(lson(index),nl,mid,cl,cr,z);
if(mid+1<=cr)upd(rson(index),mid+1,nr,cl,cr,z);
update(index);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
buildtree(1,1,n);
for(int i=0;i<m;i++){
int q,w,e,r;
cin>>q>>w>>e;
if(q==1){
cin>>r;
upd(1,1,n,w,e,r);
}else{
cout<<query(1,1,n,w,e)<<endl;
}
}
return 0;
}