如题,代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll a[1000001];
ll s[4000004],laji[4000004];
void build(ll p,ll l,ll r){
if(l==r){s[p]=a[l];return;}
ll mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
s[p]=s[p<<1]+s[p<<1|1];
}
ll querysum(ll p,ll ql,ll qr,ll l,ll r){
if(ql<=l and qr>=r)return s[p];
ll mid=(l+r)>>1;
if(laji[p]){
s[p<<1]+=(mid-l+1)*laji[p];laji[p<<1]=laji[p<<1|1]=laji[p];
s[p<<1|1]+=(r-mid)*laji[p];laji[p]=0;
}
ll sum=0;
if(ql<=mid)sum+=querysum(p<<1,ql,qr,l,mid);
if(qr>mid)sum+=querysum(p<<1|1,ql,qr,mid+1,r);
return sum;
}
void update(ll p,ll ql,ll qr,ll k,ll l,ll r){
if(ql<=l and qr>=r){laji[p]+=k;s[p]=(r-l+1)*k;return;}
ll mid=(l+r)>>1;
if(laji[p]){
s[p<<1]+=(mid-l+1)*laji[p];laji[p<<1]=laji[p<<1|1]=laji[p];
s[p<<1|1]+=(r-mid)*laji[p];laji[p]=0;
}
if(ql<=mid)update(p<<1,ql,qr,k,l,mid);
if(qr>mid)update(p<<1|1,ql,qr,k,mid+1,r);
s[p]=s[p<<1]+s[p<<1|1];
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
ll op;cin>>op;
if(op==2){
ll x,y;cin>>x>>y;
cout<<querysum(1,x,y,1,n)<<endl;
}
if(op==1){
ll x,y,z;cin>>x>>y>>z;
update(1,x,y,z,1,n);
}
}
return 0;
}
感谢各位大佬