记录一个树状数组模板。
树状数组可用在多次更改某区间的数据的情况下求区间和。
//建立树状数组
int[] tree;
//迭代步长
int lowbit(int x) {
return x & -x;
}
//查询x位置及之前的和
int query(int x) {
int ans = 0;
for (int i = x; i > 0; i -= lowbit(i)) {
ans += tree[i];
}
return ans;
}
//修改x位置处的值时,维护树状数组
void add(int x, int u) {
for (int i = x; i <= n; i += lowbit(i)){
tree[i] += u;
}
}