线段树模板求助

P3372 【模板】线段树 1

`||` -> `|`
by InversionShadow @ 2023-10-01 21:02:45


@[ydq1101](/user/672281) 马关且感谢
by zyh0516_lucky @ 2023-10-01 21:04:15


```cpp #include<bits/stdc++.h> #pragma G++ optimize(2) using namespace std; #define int long long const int N=100005; int n,m; int a[N]; struct tree{ int l,r; int val; int DelayMark; }t[4*N]; int opt,u,v,w; void Build(int p,int l,int r){ t[p].l=l; t[p].r=r; if(l==r){ t[p].val=a[l]; return; } int mid=l+r>>1; Build(p*2,l,mid); Build(p*2+1,mid+1,r); t[p].val=t[p*2].val+t[p*2+1].val; } void DelayMarkLowering(int p){ if(t[p].DelayMark){ t[p*2].val+=t[p].DelayMark*(t[p*2].r-t[p*2].l+1); t[p*2+1].val+=t[p].DelayMark*(t[p*2+1].r-t[p*2+1].l+1); t[p*2].DelayMark+=t[p].DelayMark; t[p*2+1].DelayMark+=t[p].DelayMark; t[p].DelayMark=0; } } void Change(int p,int u,int v,int w){ if(u<=t[p].l&&v>=t[p].r){ t[p].val+=w*(t[p].r-t[p].l+1); t[p].DelayMark+=w; return; } DelayMarkLowering(p); int mid=t[p].l+t[p].r>>1; if(u<=mid) Change(p*2,u,v,w); if(v>mid) Change(p*2+1,u,v,w); t[p].val=t[p*2].val+t[p*2+1].val; } int Find(int p,int u,int v){ if(u<=t[p].l&&v>=t[p].r) return t[p].val; DelayMarkLowering(p); int mid=t[p].l+t[p].r>>1,ans=0; if(u<=mid) ans+=Find(p*2,u,v); if(v>mid) ans+=Find(p*2+1,u,v); return ans; } signed main(){ // freopen("test.in","r",stdin); // freopen("test.out","w",stdout); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; Build(1,1,n); while(m--){ cin>>opt; if(opt==1){ cin>>u>>v>>w; Change(1,u,v,w); }else{ cin>>u>>v; cout<<Find(1,u,v)<<endl; } } return 0; } /* */ ```
by IndifferentBreeze @ 2023-10-01 21:45:37


@[2022zhangyuanhao](/user/746930)
by IndifferentBreeze @ 2023-10-01 21:47:06


@[IndifferentBreeze](/user/1009384) 同谢且同学
by zyh0516_lucky @ 2023-10-03 08:49:29


|