Binary Indexed Tree
概要
一点加算と区間和を $O(\log N)$ で行うデータ構造.
なお,上位互換のsegment treeもこの機能を要しており,わざわざBITを使う必要はない(実装が簡単,セグ木に対して定数倍早い,といった利点がある).
ソースコード
1-indexedなことに注意.
template<class T> std::istream &operator>>(std::istream &in,vector<T>&A){
for(T&a:A){
std::cin>>a;
}
return in;
}
template <typename T>
struct BIT{
int n;
vector<T> bit;
BIT(int n_):n(n_){
bit.resize(n+1);
}
void add(int i,T x){
i++;
while(i<=n){
bit[i]+=x;
i+=i&-i;
}
}
T sum(int i){
i++;
T s=0;
while(i>0){
s+=bit[i];
i-=i&-i;
}
return s;
}
};