Code
int lowbit(int x){
return x & -x;
}
template<class T>
struct fenwick{
int n;
vector<T> c;
fenwick() {}
fenwick(int _n): n(_n){
c.resize(n + 1);
}
fenwick(const vector<T> &a): n(a.size()){
c.resize(n + 1);
for(int i = 1; i <= n; i++){
c[i] = c[i] + a[i - 1];
int j = i + lowbit(i);
if(j <= n) c[j] = c[j] + c[i];
}
}
void add(int x, const T& v){
for(int i = x + 1; i <= n; i += lowbit(i)) c[i] = c[i] + v;
}
T ask(int x){
T ans{};
for(int i = x + 1; i; i -= lowbit(i)) ans = ans + c[i];
return ans;
}
T ask(int l, int r){
return ask(r) - ask(l - 1);
}
};
Functions
T
为支持 +++ 和 −-− 操作的类型.
fenwick<T>::fenwick(int n);
初始化一个大小为 nnn 的树状数组,每一项为 T
的初始值.
1≤n≤1071 \le n \le 10^71≤n≤107
fenwick<T>::fenwick(const vector<T>& a);
用 aaa 初始化一个大小为 ∣a∣|a|∣a∣ 的树状数组.
1≤∣a∣≤1071 \le |a| \le 10^71≤∣a∣≤107
void fenwick<T>::add(int x, const T& v);
执行 ax←ax+va_x \gets a_x+vax←ax+v.
0≤x<n0 \le x < n0≤x<n
T fenwick<T>::ask(int x);
求 a0+a1+⋯+axa_0+a_1+\cdots+a_xa0+a1+⋯+ax.
0≤x<n0 \le x < n0≤x<n
T fenwick<T>::ask(int l, int r);
求 al+al+1+⋯+ara_l+a_{l+1}+\cdots+a_ral+al+1+⋯+ar.
0≤l≤r<n0 \le l \le r < n0≤l≤r<n