#include <iostream>
#include <string>
using namespace std;
#define int long long
const int N=1e5+5;
int ori[N],n;
struct segment_tree{
int lc[4*N],rc[4*N],l[4*N],r[4*N],tot,sum[4*N],tag[4*N];
void build_node(int i,int x,int y){
tot=i;l[tot]=x;r[tot]=y;tag[tot]=0;
if (x==y)
{
sum[tot]=ori[x];
return;
}
int mid=(x+y)>>1;
lc[i]=tot+1;build_node(tot+1, x, mid);
rc[i]=tot+1;build_node(tot+1, mid+1,y);
sum[i]=sum[lc[i]]+sum[rc[i]];
}
int quiry_node(int p,int lsum,int rsum){
if (l[p]==r[p])
{
sum[p]+=tag[p];tag[p]=0;
return sum[p];
}
if (tag[p]){
sum[p]+=tag[p]*(r[p]-l[p]+1);
tag[lc[p]]+=tag[p];
tag[rc[p]]+=tag[p];
tag[p]=0;
}
int mid=(l[p]+r[p])>>1;
if (rsum<=mid) return quiry_node(lc[p],lsum, rsum);
if (lsum>mid) return quiry_node(rc[p],lsum, rsum);
return quiry_node(lc[p], lsum, mid)+quiry_node(rc[p], mid+1, rsum);
}
void update_node(int x,int p,int lup,int rup){
if (l[p]>=lup&&r[p]<=rup)
{
tag[p]+=x;
return;
}
sum[p]+=x*(rup-lup+1);
int mid=(l[p]+r[p])>>1;
if (rup<=mid)
{
update_node(x,lc[p],lup, rup);
return;
}
if (lup>mid)
{
update_node(x,rc[p],lup, rup);
return;
}
update_node(x,lc[p],lup,mid);
update_node(x,rc[p],mid+1,rup);
}
int quiry (int x,int y){
return quiry_node(1,x,y);
}
void update(int x,int ll,int rr){
update_node(x,1,ll,rr);
}
void build(int n){
build_node(1,1,n);
}
}tr;
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int cas=0,T,x,y,k;
string str;
cin>>n;cin>>T;
for (int i=1;i<=n;i++) cin>>ori[i];
tr.build(n);
while (T--){
cin>>str;
if (str=="1"){
cin>>x>>y>>k;
tr.update(k,x,y);
}
else {
cin>>x>>y;
cout<<tr.quiry(x, y)<<endl;
}
}
return 0;
}
不知道怎么描述我的错误,以前基本上都是照着板子打的线段树,现在自己写了一次果然错了……如果有大佬指点我一下就好了