神奇的树状数组啊
vi tr(N);
//初始化数组
void init(int len){
fill(tr.begin(), tr.ebgin() + len + 1, 0);
}
//去只是需要更新的区间的操作
void add1(int l, int r, int k){
add2(l, k);
if(r < n) add2(r + 1, -k);
}
//真正的操作,实际上应该写在 add1 前面,此处是按照思路顺序写的
void add2(int l, int k){
for(int i = l; i <= n; i += (i & (-i)){ //也可以平时的树状数组一样写出去
tr[i] += k;
}
}
//这里一般需要改编, 这里的实例属于普通前缀和一下,如果需要计算某一段区间,那就计算两个前缀和
int sum(int l){
int ans = 0;
for(int i = l; i; i -= (i & (-i))){
ans += tr[i];
}
return ans;
}