0720wangyuxiang @ 2025-01-11 19:46:49
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N],n,ans,m;
struct node{
int l;
int r;
int data;
int tag;
}t[4*N];
void build(int L,int R,int i){
t[i].l=L;
t[i].r=R;
if(L==R){
t[i].data=a[L];
return;
}
int mid=(L+R)/2;
build(L,mid,i*2);
build(mid+1,R,i*2+1);
t[i].data=t[i*2].data+t[i*2+1].data;
return ;
}
//int build2(int i){
// if(t[i].l==t[i].r){
// t[i].data=a[t[i].l];
// return t[i].data;
// }
// t[i].data=build2(i*2)+build2(i*2+1);
// return t[i].data;
//}
void spread(int i){
if(t[i].tag){
t[i*2].data+=t[i].tag*(t[i*2].r-t[i*2].l+1);
t[i*2+1].data+=t[i].tag*(t[i*2+1].r-t[i*2+1].l+1);
t[i*2].tag+=t[i].tag;
t[i*2+1].tag+=t[i].tag;
t[i].tag=0;
}
return ;
}
void modifty(int i,int L,int R,int k){
if(L<=t[i].l&&t[i].r<=R){
t[i].data+=k*(t[i].r-t[i].l+1);
t[i].tag+=k;
return ;
}
spread(i);
if(L<=t[i*2].r)modifty(i*2,L,R,k);
if(t[i*2+1].l<=R)modifty(i*2+1,L,R,k);
return ;
}
void fnd(int i,int L,int R){
if(L<=t[i].l&&t[i].r<=R){
ans+=t[i].data;
return ;
}
spread(i);
if(L<=t[i*2].r)fnd(i*2,L,R);
if(t[i*2+1].l<=R)fnd(i*2+1,L,R);
return ;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,n,1);
//build2(1);
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
if(x==1){
int k;
cin>>k;
modifty(1,y,z,k);
}
else{
ans=0;
fnd(1,y,z);
cout<<ans<<'\n';
}
}
return 0;
}
by _xguagua_Firefly_ @ 2025-01-11 20:06:53
@0720wangyuxiang
modify
以后没有 pushup
导致的。
void modifty(int i,int L,int R,int k){
if(L<=t[i].l&&t[i].r<=R){
t[i].data+=k*(t[i].r-t[i].l+1);
t[i].tag+=k;
return ;
}
spread(i);
if(L<=t[i*2].r)modifty(i*2,L,R,k);
if(t[i*2+1].l<=R)modifty(i*2+1,L,R,k);
t[i].data=t[i*2].data+t[i*2+1].data; // Here
return ;
}
by 0720wangyuxiang @ 2025-01-11 20:54:54
@_xguaguaFirefly 谢谢