2012_Zhang_ @ 2024-11-17 07:24:02
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
int l,r,w,lzy;
}t[1000000];
bool in(int a,int b,int c,int d){return a<=b&&c<=d;}
bool out(int a,int b,int c,int d){return c<a||d<b;}
int x[1000000];
void build(int u,int L,int R){
t[u].l=L,t[u].r=R,t[u].lzy=0;
if(L==R){t[u].w=x[L]; return;}
build(u*2,L,(L+R)/2);
build(u*2+1,(L+R)/2+1,R);
t[u].w=t[u*2].w+t[u*2+1].w;
return;
}
void dlzy(int u,int L,int R,int x){
if(out(L,t[u].l,t[u].r,R))return;
if(in(L,t[u].l,t[u].r,R)){
t[u].lzy+=x,t[u].w+=(t[u].r-t[u].l+1)*x;
return;
}
dlzy(u*2,L,R,x);
dlzy(u*2+1,L,R,x);
t[u].w=t[u*2].w+t[u*2+1].w;
return;
}
int ask(int u,int L,int R){
if(out(L,t[u].l,t[u].r,R)){
return 0;
}
if(in(L,t[u].l,t[u].r,R)){
return t[u].w;
}
t[u*2].lzy=t[u].lzy,t[u*2].w+=(t[u*2].r-t[u*2].l+1)*t[u].lzy;
t[u*2+1].lzy=t[u].lzy,t[u*2+1].w+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].lzy;
t[u].lzy=0;
return ask(u*2,L,R)+ask(u*2+1,L,R);
}
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>x[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,y,z;
cin>>x>>y>>z;
dlzy(1,x,y,z);
}else{
int x,y;
cin>>x>>y;
cout<<ask(1,x,y)<<endl;
}
}
}
by wild_asriel_X @ 2024-11-17 08:28:48
@2012Zhang 你的 dlzy
好像没有 push_down ,也不是 t[u].w=t[u*2].w+t[u*2+1].w+t[u].lzy*(t[u].r-t[u].l+1);
,并且 ask
push_down 时应该是 t[u*2].lzy+=t[u].lzy
和
t[u*2+1].lzy+=t[u].lzy
。
by 2012_Zhang_ @ 2024-11-17 21:24:20
@wild_asriel_X 已过+已关 拜谢