/** * 单点更新 * * @param i 原始数组索引 i * @param delta 变化值 = 更新以后的值 - 原始值 */ publicvoidupdate(int i, int delta){ // 从下到上更新,注意,预处理数组,比原始数组的 len 大 1,故 预处理索引的最大值为 len while (i <= len) { tree[i] += delta; i += lowbit(i); } }
publicstaticintlowbit(int x){ return x & (-x); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/** * 查询前缀和 * * @param i 前缀的最大索引,即查询区间 [0, i] 的所有元素之和 */ publicintquery(int i){ // 从右到左查询 int sum = 0; while (i > 0) { sum += tree[i]; i -= lowbit(i); } return sum; }