It is used to find interval change and interval evaluation problem.
#include <bits/stdc++.h>using namespacestd;Const intn=1e5+Ten;intn,m;inta[n],add[4*N];Long Longsum[4*N];voidBuildintLintRintk) { if(l==R) {Sum[k]=A[l]; return ; } intMid= (l+r) >>1; Build (L,mid,k<<1); Build (Mid+1,r,k<<1|1); SUM[K]=sum[k<<1]+sum[k<<1|1];}voidAdintLintRintKintv) {Add[k]+=v; SUM[K]+=(Long Long) v* (r-l+1); }voidPushdown (intLintRintKintmid) { if(add[k]==0)return ; AD (L,mid,k<<1, Add[k]); AD (Mid+1,r,k<<1|1, Add[k]); ADD[K]=0;}voidModifyintLintRintXintYintVintk) { if(L>=x && y>=r)returnAD (l,r,k,v); intMid= (l+r) >>1; Pushdown (L,r,k,mid); if(x<=mid) Modify (l,mid,x,y,v,k<<1); if(y>mid) Modify (mid+1,r,x,y,v,k<<1|1); SUM[K]=sum[k<<1]+sum[k<<1|1];}Long LongInquireintLintRintXintYintk) { if(X<=l && r<=y)returnSum[k]; intMid= (l+r) >>1; Pushdown (L,r,k,mid); Long Longres=0; if(X<=mid) Res+=inquire (l,mid,x,y,k<<1); if(Y>mid) Res+=inquire (mid+1,r,x,y,k<<1|1); returnRes;} intMain () {CIN>>n>>m; for(intI=1; i<=n;i++) Cin>>A[i]; Build (1N1); for(intI=1; i<=m;i++){ intopt; CIN>>opt; if(opt==1){ intx,y,v; CIN>>x>>y>>v; Modify (1, N,x,y,v,1); } Else { intx, y; CIN>>x>>y; cout<<inquire (1, N,x,y,1) <<Endl; } } return 0;}
Data structure: Segment tree