tiankong153 @ 2023-10-10 17:29:35
#include<bits/stdc++.h>
using namespace std;
long long d[40008],add[40008];
int n,m;
int a,b,flag;
long long c;
void build(int k,int l,int r){
if(l==r){
scanf("%lld%",&d[k]);
return;
}
int mid=l+((r-l)>>1);
build(2*k,l,mid),build(2*k+1,mid+1,r);
d[k]=d[k*2]+d[k*2+1];
}
void Add(int k,int l,int r,int v){
add[k]+=v;
d[k]+=(r-l+1)*v;
return;
}
void pushdown(int k,int l,int r,int mid){
if(add[k]!=0){
d[k*2]+=add[k]*(mid-l+1);
d[k*2+1]+=add[k]*(r-mid);
add[k*2]+=add[k];
add[k*2+1]+=add[k];
add[k]=0;
}
}
void change(int k,int l,int r,int x,int y,int v){
if(l>r)
return;
if(x<=l&&y>=r)Add(k,l,r,v);
int mid=(l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)change(2*k,l,mid,x,y,v);
if(y>mid)change(2*k+1,mid+1,r,x,y,v);
d[k]=d[k*2]+d[k*2+1];
}
long long getsum(int k,int l,int r,int x,int y){
if(x<=l&&y>=r)return d[k];
int mid=(l+r)>>1;
long long res=0;
if(x<=mid)res+=getsum(2*k,l,mid,x,y);
if(y>mid)res+=getsum(2*k+1,mid+1,r,x,y);
return res;
}
int main(){
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&flag,&a,&b);
if(flag==1){
scanf("%lld",&c);
change(1,1,n,a,b,c);
}
if(flag==2)
printf("%lld\n",getsum(1,1,n,a,b));
}
return 0;
}
各位神犇们真的改不出来了
运行有问题
by Misophiliac @ 2023-10-10 17:39:14
@tiankong153
change()
第二个判断里要 return
;getsum()
里声明 mid
后 pushdown
一次。by tiankong153 @ 2023-10-10 17:41:50
@yuanxiuan 改出来了,谢谢