RT,最新代码:
#include<iostream>
using namespace std;
#define MAXN 100000
#define ll long long
struct node{
int l,r,w,tag;
}tree[4*MAXN];
ll n,m,a[MAXN];
void pushdown(ll i){
tree[i*2].tag+=tree[i].tag;
tree[i*2+1].tag+=tree[i].tag;
tree[i*2].w+=tree[i].w*(tree[i*2].r-tree[i*2].l+1);
tree[i*2+1].w+=tree[i].w*(tree[i*2+1].r-tree[i*2+1].l+1);
tree[i].tag=0;
return;
}
void update(ll i,ll l,ll r,ll k){
if(tree[i].l>=l&&tree[i].r<=r){
tree[i].w+=k*(tree[i].r-tree[i].l+1);
tree[i].tag+=k;
return;
}
pushdown(i);
ll mid=(tree[i].l+tree[i].r)/2;
if(mid>=l)
update(i*2,l,r,k);
if(mid+1<=r)
update(i*2+1,l,r,k);
tree[i].w=tree[i*2].w+tree[i*2+1].w;
return;
}
ll sum(ll i,ll l,ll r){
if(tree[i].l>=l&&tree[i].r<=r)
return tree[i].w;
pushdown(i);
ll ans=0,mid=(tree[i].l+tree[i].r)/2;
if(mid>=l)
ans+=sum(i*2,l,r);
if(mid+1<=r)
ans+=sum(i*2+1,l,r);
return ans;
}
void build(ll i,ll l,ll r){
tree[i].l=l,tree[i].r=r;
if(l==r){
tree[i].w=a[l];
return;
}
ll mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].w=tree[i*2].w+tree[i*2+1].w;
return;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--){
int t;
cin>>t;
if(t==1){
ll x,y,k;
cin>>x>>y>>k;
update(1,x,y,k);
}
else{
ll x,y;
cin>>x>>y;
cout<<sum(1,x,y)<<endl;
}
}
return 0;
}