遅延セグメントtreeを使って解きます。
まず、 Dx=∑i=1xCx=∑i=1x(x+1−i)Bx です。
ここで、 El,r=∑i=lr−1(r−i)Bi さらに、Fl,r=∑i=lr−1Bi と定義します。
Dx=E1,(x+1) となるため、この El,r を求めることができれば良いです。
ここで、 El,k,Ek,r,Fl,k,Fk,r(l≤k≤r) がわかっているとき、以下が成り立ちます。
El,r=El,k+Ek,r+(r−k)Fl,k
Fl,r=Fl,k+Fk,r
また、i=l,l+1,...r−2,r−1 に対して Bi+=dif をすると、El,r,Fl,r は以下のように変化します。
El,r+=dif2(r−l)(r−l+1)
Fl,r+=(r−l)dif
Ax←v というクエリは、dif=v−Ax とおくことで、 i=x,x+1,...N に対して Bi+=dif とするクエリと置き換えることができるので、(El,r,Fl,r,r−l) をノードにもつ遅延セグメントtreeを使用することで、二つのクエリを一つ当たり O(logN) で処理することができます。
実装例