#pragma once
#include"binary-indexed-tree.hpp"template<typenameT>structRangeAddRangeSumBIT{BinaryIndexedTree<T>a,b;RangeAddRangeSumBIT(intN):a(N+1),b(N+1){}// add x to [l, r)voidadd(intl,intr,Tx){a.add(l,x);a.add(r,-x);b.add(l,x*(1-l));b.add(r,x*(r-1));}// return sum of [l, r)Tsum(intl,intr){--r,--l;returna.sum(r)*r+b.sum(r)-a.sum(l)*l-b.sum(l);}};
#line 2 "data-structure/range-sum-range-add-bit.hpp"
#line 2 "data-structure/binary-indexed-tree.hpp"
template<typenameT>structBinaryIndexedTree{intN;vector<T>data;BinaryIndexedTree()=default;BinaryIndexedTree(intsize){init(size);}voidinit(intsize){N=size+2;data.assign(N+1,{});}// get sum of [0,k]Tsum(intk)const{if(k<0)returnT{};// return 0 if k < 0Tret{};for(++k;k>0;k-=k&-k)ret+=data[k];returnret;}// getsum of [l,r]inlineTsum(intl,intr)const{returnsum(r)-sum(l-1);}// get value of kinlineToperator[](intk)const{returnsum(k)-sum(k-1);}// data[k] += xvoidadd(intk,Tx){for(++k;k<N;k+=k&-k)data[k]+=x;}// range add x to [l,r]voidimos(intl,intr,Tx){add(l,x);add(r+1,-x);}// minimize i s.t. sum(i) >= wintlower_bound(Tw){if(w<=0)return0;intx=0;for(intk=1<<__lg(N);k;k>>=1){if(x+k<=N-1&&data[x+k]<w){w-=data[x+k];x+=k;}}returnx;}// minimize i s.t. sum(i) > wintupper_bound(Tw){if(w<0)return0;intx=0;for(intk=1<<__lg(N);k;k>>=1){if(x+k<=N-1&&data[x+k]<=w){w-=data[x+k];x+=k;}}returnx;}};/**
* @brief Binary Indexed Tree(Fenwick Tree)
*/#line 4 "data-structure/range-sum-range-add-bit.hpp"
template<typenameT>structRangeAddRangeSumBIT{BinaryIndexedTree<T>a,b;RangeAddRangeSumBIT(intN):a(N+1),b(N+1){}// add x to [l, r)voidadd(intl,intr,Tx){a.add(l,x);a.add(r,-x);b.add(l,x*(1-l));b.add(r,x*(r-1));}// return sum of [l, r)Tsum(intl,intr){--r,--l;returna.sum(r)*r+b.sum(r)-a.sum(l)*l-b.sum(l);}};