Interval modification of a tree-like array
We assume that \ (a_i\) is the value of each point itself,\ (d_i = a_i-a_{i-1}\) is the difference value.
So:
\[\sum a_x = \sum_{i=1}^x D_i\]
So
\[\sum_{i=1}^x a_i = \sum_{i=1}^x \sum_{j=1}^i d_i = \sum_{i=1}^x (x-i+1) d_i\]
Bashi the child apart:
\[\sum_{i=1}^x a_i = (x+1) \sum_{i=1}^x d_i-\sum_{i=1}^x i d_i\]
So use two tree-like arrays \ (c1\),\ (c2\) to maintain \ (d_i\) and \ (id_i\) respectively.
The specific process is:
\ (update\): Add the value of \ ([l,r]\) to \ (val\)
(1)\ (Add (c_1, l,val) \) ; \ (Add (c_1, r+1,-val) \ );
(2)\ (Add (c_2, l,l*val) \) ; \ (Add (c_2,r+1,-(r+1) *val) \) ;
._.
\ (get\): Query \ ([l,r]\) elements and
(1) $Sigma (x) = (x+1) *query (c_1,x)-Query (c_2,x); $
(2) $Res _{[l,r]} = Sigma (R)-Sigam (L-1); $
._.
Code:
IL ll Query(RG int p){ RG ll d=0 , s=(p+1); while(p)d+= 1ll*s*c1[p]-c2[p], p-=(p&-p); return d;}IL int Get(int L,int R){return 1ll*Query(R) - 1ll*Query(L-1);}IL void Add(ll *bit,int p,int d){while(p<=m)bit[p]+=d,p+=(p&-p);}IL void Update(RG int L,RG int R,RG int dt){ Add(c1,L,dt); Add(c1,R+1,-dt); Add(c2,L,dt*L); Add(c2,R+1,-dt*(R+1));}
Interval modification and query of a tree-like array