应该是 update 出锅了.。
#include<cstdio>
#define maxn 100005
#define ll long long
#define ls(k) k<<1
#define rs(k) k<<1|1
#define push_up(k) sum[k]=sum[ls(k)]+sum[rs(k)]
#define push_down(k,l,r,v) tag[k]+=v,sum[k]+=v*(r-l+1)
int L,R;
ll a[maxn],sum[maxn<<2],tag[maxn<<2],v;
void build(int k,int l,int r){
if(l==r){
sum[k]=a[l];
return;
}
int mid=l+r>>1;
build(ls(k),l,mid),
build(rs(k),mid+1,r);
push_up(k);
}
void update(int k,int l,int r){
if(L<=l&&r<=R){
push_down(k,l,r,v);
return;
}
int mid=l+r>>1;
push_down(ls(k),l,mid,tag[k]);
push_down(rs(k),mid+1,r,tag[k]);
tag[k]=0;
if(L<=mid)
update(ls(k),l,mid);
if(mid<R)
update(rs(k),mid+1,r);
push_up(k);
}
ll query(int k,int l,int r){
if(L<=l&&r<=R)
return sum[k];
int mid=l+r>>1;
ll ans=0;
push_down(ls(k),l,mid,tag[k]);
push_down(rs(k),mid+1,r,tag[k]);
tag[k]=0;
if(L<=mid)
ans+=query(ls(k),l,mid);
if(mid<R)
ans+=query(rs(k),mid+1,r);
return ans;
}
int main(){
int n,m,op;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
scanf("%d%d%d",&op,&L,&R);
if(op==1)
scanf("%lld",&v),update(1,1,n);
else
printf("%lld\n",query(1,1,n));
}
return 0;
}
in:
5 5
1 5 4 2 3
1 2 3 2
1 1 5 1
2 1 3
2 3 5
2 2 4
第一次修改完为 1 7 6 2 3
。
第二次修改完为 2 8 7 3 4
。
output:
17
14
18
myoutput:
17
18
22