/** * Binary Index Tree * 树状数组 * 思想是: 前缀区间的差集 */ publicclassBIT { privateint[] tree; privateint len;
publicBIT(int n){ len = n + 1; tree = newint[len]; }
/** * 做单点更新 * 要把包含了nums[i]的元素全部更新 * @param i 下标 * @param delta 增加的值 */ publicvoidupdate(int i, int delta){ i = i + 1; while (i < len){ tree[i] += delta; i += lowbit(i); } }
/** * * @param i 下标 i * @return 前 i 个元素之和 */ publicintquery(int i){ intsum=0; i = i + 1; while (i > 0){ sum += tree[i]; i -= lowbit(i); // 不断去掉(二进制表示下)最后一个1 } return sum; }