rt,应该是add函数出错了,但一直都找不出来,老师也找不出来
#include<bits/stdc++.h>
using namespace std;
#define lid (id<<1)
#define rid (id<<1|1)
struct tree{
int l,r,s,lz=0;
}t[40005];
int a[10005],n;
void pd(int id){
if(t[id].lz&&t[id].l!=t[id].r){
t[lid].lz+=t[id].lz;
t[rid].lz+=t[id].lz;
t[lid].s+=t[id].lz*(t[lid].r-t[lid].l+1);
t[rid].s+=t[id].lz*(t[rid].r-t[rid].l+1);
t[id].lz=0;
}
}
void bt(int id,int l,int r){
t[id].l=l;t[id].r=r;
if(l==r){
t[id].s=a[l];return;
}
int mid=(l+r)/2;
bt(lid,l,mid);
bt(rid,mid+1,r);
t[id].s=t[lid].s+t[rid].s;
}
void add(int id,int l,int r,int val){
pd(id);
if(t[id].l==l&&t[id].r==r){
t[id].lz+=val;
t[id].s+=val*(t[id].r-t[id].l+1);
return;
}
int mid=(l+r)/2;
if(r<=mid)add(lid,l,r,val);
else if(l>mid)add(rid,l,r,val);
else add(lid,l,mid,val),add(rid,mid+1,r,val);
t[id].s=t[lid].s+t[rid].s;
}
int get(int id,int l,int r){
pd(id);
if(t[id].l==l&&t[id].r==r)return t[id].s;
int mid=(t[id].l+t[id].r)/2;
if(mid>=r)return get(lid,l,r);
if(l>mid)return get(rid,l,r);
return get(lid,l,mid)+get(rid,mid+1,r);
}
int main(){
int q;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
bt(1,1,n);
for(int i=1;i<=q;i++){
int tp,x,y,z;
cin>>tp;
if(tp==1){
cin>>x>>y>>z;
add(1,x,y,z);
}
else{
cin>>x>>y;
cout<<get(1,x,y)<<endl;
}
}
}