shu_ye @ 2024-07-18 11:58:00
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[1000010]={},t[2000010]={},tag[2000010]={};
void buid(int f,int l,int r){
if(l==r){
t[f]=a[l];
return;
}
int mid=(l+r)/2;
buit(f*2,l,mid);
buit(f*2+1,mid+1,r);
t[f]=t[f*2]+t[f*2+1];
}
void push(int left,int right,int f){
int mid=(left+right)>>1;
t[f<<1]+=tag[f]*(mid-left+1);
t[f<<1|1]+=tag[f]*(right-mid);
tag[f<<1]=tag[f];
tag[f<<1|1]=tag[f];
tag[f]=0;
}
int query(int l,int r,int left,int right,int f){
int ans=0;
if(l<=left&&r>=right){
return t[f];
}
int mid=(left+right)/2;
push(left,right,f);
if(l<=mid){
ans+=query(l,r,left,mid,f*2);
}
if(r>mid){
ans+=query(l,r,mid+1,right,f*2+1);
}
return ans;
}
void update(int l,int r,int left,int right,int f,int k){
if(l<=left&&r>=right){
t[f]+=k*(right-left+1);
tag[f]+=k;
return;
}
push(left,right,f);
int mid=(left+right)>>1;
if(l<=mid) update(l,r,left,mid,f<<1,k);
if(r>mid) update(l,r,mid+1,right,f<<1|1,k);
t[f]=t[f<<1]+t[f<<1|1];
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
buit(1,1,n);
while(m--){
int c,l,r,k;
scanf("%lld%lld%lld",&c,&l,&r);
if(c==2){
printf("%lld\n",query(l,r,1,n,1));
}
else{
scanf("%lld",&k);
update(l,r,1,n,1,k);
}
}
}
by Mini_PEKKA @ 2024-07-18 12:04:18
tag[f<<1]=tag[f];
tag[f<<1|1]=tag[f];
改为
tag[f<<1]+=tag[f];
tag[f<<1|1]+=tag[f];
by shu_ye @ 2024-07-18 12:09:27
@Mini_PEKKA 临表涕零,不知所言。 太感谢了