膜拜陈桉大佬 @ 2022-11-21 19:41:50
谢谢!
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m;
ll a[100020];
struct node{
ll l,r,lz,mx;
}tree[400020];
void build (int k,int l,int r){
tree[k].l=l;
tree[k].r=r;
tree[k].lz=0;
tree[k].mx=0;
if(l==r){
tree[k].mx=a[l];
return;
}
int mid,lc,rc;
lc=2*k;
rc=2*k+1;
mid=l+(r-l)/2;
build(lc,l,mid);
build(rc,mid+1,r);
tree[k].mx=tree[lc].mx+tree[rc].mx;
}
void lazy(int k,int v){
tree[k].mx+=v*(tree[k].r-tree[k].l+1);
tree[k].lz+=v;
}
void pushdown(int k){
int mid,lc,rc;
lc=2*k;
rc=2*k+1;
mid=(tree[k].l+tree[k].r)/2;
tree[lc].mx=tree[lc].mx+tree[k].lz*(mid-tree[k].l+1);
tree[lc].lz=tree[k].lz;
tree[rc].mx=tree[rc].mx+tree[k].lz*(tree[k].r-mid);
tree[rc].lz=tree[k].lz;
tree[k].lz=0;
}
void update(int k,int l,int r,int v){
if(tree[k].l>=l&&tree[k].r<=r){
lazy(k,v);return;
}
if(tree[k].lz!=0)pushdown(k);
int mid,lc,rc;
lc=2*k;
rc=2*k+1;
mid=(tree[k].l+tree[k].r)/2;
if(tree[lc].r>=l)update(lc,l,r,v);
if(tree[rc].l<=r)update(rc,l,r,v);
tree[k].mx=tree[lc].mx+tree[rc].mx;
}
int query(int k,int l,int r){
ll sum=0;
if(tree[k].l>=l&&tree[k].r<=r){
sum+=tree[k].mx;
return tree[k].mx;
}
if(tree[k].lz!=0)pushdown(k);
int mid,lc,rc;
lc=2*k;
rc=2*k+1;
mid=(tree[k].l+tree[k].r)/2;
if(tree[lc].r>=l)sum+=query(lc,l,r);
if(tree[rc].l<=r)sum+=query(rc,l,r);
return sum;
}
int main(){
int f,x,y,k;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>f;
if(f==1){
cin>>x>>y>>k;
update(1,x,y,k);
}
else if(f==2){
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
by 8atemak1r @ 2022-11-21 19:59:19
@膜拜陈桉大佬 pushdown
里应为 tree[lc].lz+=tree[k].lz;
和 tree[rc].lz+=tree[k].lz;
by 膜拜陈桉大佬 @ 2022-11-21 20:08:37
@8atemak1r 改完后提交是70分,不知道是哪里还有问题
by 膜拜陈桉大佬 @ 2022-11-21 20:33:30
@8atemak1r 解决了,就是开long long
的问题(开了但没完全开