树状数组
1.
从二进制下可以看出到某一点的前缀和为idx不断去掉一个'1'形成的新索引下的区间和,获取最后一个'1'
int lowbit(int x) { return x&(-x); }
2.
查询[L,R]之间的和
sum(R)-sum(L-1)
单次查询次数=log2(10^5)=17
单次查询时间复杂度:O(logN)
int sum(int x) { int res = 0; for (; x; x -= lowbit(x)) { res += tree[x]; } return x; }
3.单点更新
void add(int x, int v) { for (; x <= MaxVal; x += lowbit(x)) { tree[x] += v; } }
单次查询次数=log2(10^5)=17
单次查询时间复杂度:O(logN)