/** * 初始化构造Binary Indexed Tree */ voidinit(){ // indexed tree下标从0开始,并且0位无效 for (int i = 1; i <= input.length; i++) update(i, input[i - 1]); }
/** * 更新指定位置的数值 * * @param index Binary Indexed Tree的元素索引。即,输入数组的的索引+1。如果输入数组的索引从1开始有效,则可以直接使用其索引。<br/> * 索引从1开始 * @param abs 指定位置的变更值=修改后的值-变更前的值 */ voidupdate(int index, int abs){ while (index < tree.length) { tree[index] += abs; index += lowBit(index); } }
/** * 计算前N项和,index从1开始计数 */ intsum(int index){ int sum = 0; while (index > 0) { sum += tree[index]; index -= lowBit(index); } return sum; }
/** * 计算a到b的和(包含a和b)<br/> * a和b均从0开始 */ intbetween(int a, int b){ // 转换成Binary Indexed Tree下标 int from = Math.min(a, b) + 1; int to = Math.max(a, b) + 1; return sum(to) - sum(from - 1); // 包含b }