单点修改 区间查询
void modify(int x, int k){ //给序号为x的节点加上K
for(int i = x; i <= n; i += (i & -i)) {
t[i] += k;
}
return;
}
int query(int x){
int sum = 0;
for(int i = x ; i >= 1 ;i -= (i & -i)) {
sum += t[i];
}
return sum;
}
上述查询函数为[1,x]区间查询
若需查询[l,r],可以query(r)-query(l - 1)
----------------------------------------------------
区间修改 单点查询
利用原数组构造差分数组,区间修改时只需修改t[l]和t[r+1],单点查询时求前缀和
void modify(int x, int k) {
for(int i = x; i <= n; i += (i & -i)) {
t[i] += k;
}
return;
}
modify(l, k);
modify(r + 1, -k);
int find(int x) {
int ans = 0;
for(int i = x; i >= 0; i -= (i & -i)) {
ans += t[i];
}
return ans;
}
------------------------------------------------
区间修改,区间查询建议用线段树