#pragma once
template<typenameT,typenameE>structRange_Weighted_Add_Range_Sum_SegTree{intn,height;Tti={0,0};Eei=0;vector<T>dat;vector<E>laz;Range_Weighted_Add_Range_Sum_SegTree(constvector<T>&v){init((int)v.size());build(v);}voidinit(intn_){n=1;height=0;while(n<n_)n<<=1,height++;dat.assign(2*n,ti);laz.assign(2*n,ei);}voidbuild(constvector<T>&v){intn_=v.size();init(n_);for(inti=0;i<n_;i++)dat[n+i]=v[i];for(inti=n-1;i;i--){dat[i].first=dat[(i<<1)|0].first+dat[(i<<1)|1].first;dat[i].second=dat[(i<<1)|0].second+dat[(i<<1)|1].second;}}inlineTreflect(intk){returnlaz[k]==ei?dat[k]:T{dat[k].first+laz[k]*dat[k].second,dat[k].second};}inlinevoideval(intk){if(laz[k]==ei)return;laz[(k<<1)|0]+=laz[k];laz[(k<<1)|1]+=laz[k];dat[k]=reflect(k);laz[k]=ei;}inlinevoidthrust(intk){for(inti=height;i;i--)eval(k>>i);}inlinevoidrecalc(intk){while(k>>=1)dat[k].first=reflect((k<<1)|0).first+reflect((k<<1)|1).first;}voidupdate(inta,intb,Ex){thrust(a+=n);thrust(b+=n-1);for(intl=a,r=b+1;l<r;l>>=1,r>>=1){if(l&1)laz[l]+=x,l++;if(r&1)--r,laz[r]+=x;}recalc(a);recalc(b);}voidupdate(inta,Ex){thrust(a+=n);laz[a]+=x;recalc(a);}voidset_val(inta,Tx){thrust(a+=n);dat[a]=x;laz[a]=ei;recalc(a);}Equery(inta,intb){thrust(a+=n);thrust(b+=n-1);Eret=ei;for(intl=a,r=b+1;l<r;l>>=1,r>>=1){if(l&1)ret+=reflect(l++).first;if(r&1)ret+=reflect(--r).first;}returnret;}Equery(inta){thrust(a+=n);returnreflect(a).first;}};