您update里的if判断条件好像写错了qwq
by andybest @ 2020-12-03 13:10:18
```cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll f,x,y,z,n,m,a[4000001],k[4000001],lz[4000001];
inline void shxbuild(ll p,ll l,ll r){
if(l==r){k[p]=a[l]; return;}
shxbuild(p*2,l,(l+r)/2);
shxbuild(p*2+1,(l+r)/2+1,r);
k[p]=k[p*2]+k[p*2+1];
}inline void shx(ll p,ll l,ll r,ll nw){
lz[p]+=nw,k[p]+=nw*(r-l+1);
}inline void shxdown(ll p,ll l,ll r){
shx(p*2,l,(l+r)/2,lz[p]);
shx(p*2+1,(l+r)/2+1,r,lz[p]);
lz[p]=0;
}inline void shxadd(ll p,ll l,ll r){
if(x<=l&&y>=r){k[p]+=z*(r-l+1),lz[p]+=z; return;}
shxdown(p,l,r);
ll mid=(l+r)/2;
if(x<=mid) shxadd(p*2,l,mid);
if(y>mid) shxadd(p*2+1,mid+1,r);
k[p]=k[p*2]+k[p*2+1];
}inline ll shxask(ll p,ll l,ll r){
ll ret=0;
if(x<=l&&y>=r) return k[p];
shxdown(p,l,r);
ll mid=(l+r)/2;
if(x<=mid) ret+=shxask(p*2,l,(l+r)/2);
if(y>mid) ret+=shxask(p*2+1,(l+r)/2+1,r);
return ret;
}int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
shxbuild(1,1,n);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&f,&x,&y);
if(f==1){scanf("%lld",&z); shxadd(1,1,n);}
if(f==2) printf("%lld\n",shxask(1,1,n));
} return 0;
}
```
by ye____ @ 2020-12-03 19:21:41
@[shxshx](/user/304089) 您这是线段树1的,我想问线段树2
by 听取MLE声一片 @ 2020-12-03 22:28:59
@[andybest](/user/224178) 感谢,还有一个模错变量的锅
by 听取MLE声一片 @ 2020-12-03 22:43:20