求助线段树写挂了

P3373 【模板】线段树 2

您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


|