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);
初始化一个大小为
n
n
n 的树状数组,每一项为 T
的初始值.
1
≤
n
≤
1
0
7
1 \le n \le 10^7
1≤n≤107
fenwick<T>::fenwick(const vector<T>& a);
用
a
a
a 初始化一个大小为
∣
a
∣
|a|
∣a∣ 的树状数组.
1
≤
∣
a
∣
≤
1
0
7
1 \le |a| \le 10^7
1≤∣a∣≤107
void fenwick<T>::add(int x, const T& v);
执行
a
x
←
a
x
+
v
a_x \gets a_x+v
ax←ax+v.
0
≤
x
<
n
0 \le x < n
0≤x<n
T fenwick<T>::ask(int x);
求
a
0
+
a
1
+
⋯
+
a
x
a_0+a_1+\cdots+a_x
a0+a1+⋯+ax.
0
≤
x
<
n
0 \le x < n
0≤x<n
T fenwick<T>::ask(int l, int r);
求
a
l
+
a
l
+
1
+
⋯
+
a
r
a_l+a_{l+1}+\cdots+a_r
al+al+1+⋯+ar.
0
≤
l
≤
r
<
n
0 \le l \le r < n
0≤l≤r<n