代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
long long n,m,a[maxn],sum[maxn*4],add[maxn*4],op,x,y,k;
void pushdown(int ln,int rn,int o){//ln=左子树节点数,rn=右子树结点数
if(add[o]!=0){
add[o*2]+=add[o];
add[o*2+1]+=add[o];
sum[o*2]+=add[o]*ln;
sum[o*2+1]+=add[o]*rn;
add[o]=0;
}
return;
}
void build(int l,int r,int o){
if(l==r){
sum[o]=a[l];//sum[o]=a[r];
return;
}
int mid=(l+r)/2;
build(l,mid,o*2);
build(mid+1,r,o*2+1);
sum[o]=sum[o*2]+sum[o*2+1];
return;
}
void update(int l,int r,int o){
if(x<=l&&y>=r){
return;
}
int mid=(l+r)/2;
pushdown(mid-l+1,r-mid,o);
if(x<=mid){
update(l,mid,o*2);
}
if(y>mid){
update(mid+1,r,o*2+1);
}
sum[o]=sum[o*2]+sum[o*2+1];
return;
}
long long query(int l,int r,int o){
if(x<=l&&y>=r){
return sum[o];
}
int mid=(l+r)/2;
long long zc=0;
pushdown(mid-l+1,r-mid,o);
if(x<=mid){
zc+=query(l,mid,o*2);
}
if(y>mid){
zc+=query(mid+1,r,o*2+1);
}
return zc;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
cin>>op;
if(op==1){
cin>>x>>y>>k;
update(1,n,1);
}else if(op==2){
cin>>x>>y;
cout<<query(1,n,1)<<endl;
}
}
return 0;
}
样例未过。
本帖禁止无意义回复,请提供有效帮助。