Bootstrap

模板分享:树状数组

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 1n107

fenwick<T>::fenwick(const vector<T>& a);

a a a 初始化一个大小为 ∣ a ∣ |a| a 的树状数组.
1 ≤ ∣ a ∣ ≤ 1 0 7 1 \le |a| \le 10^7 1a107

void fenwick<T>::add(int x, const T& v);

执行 a x ← a x + v a_x \gets a_x+v axax+v.
0 ≤ x < n 0 \le x < n 0x<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 0x<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 0lr<n

;