1、树状数组的构建

public static void main(String[] args) {
int[] a = {0,1,2,3,4,5,6,7,8};
int[] c = new int[a.length];
for(int i = 1;i < c.length;i++) {
for(int j = i-lowbit(i)+1;j <= i;j++) {
c[i] += a[j];
}
}
}
2、树状数组的前缀和查询

static int sum(int n) {
int res = 0;
for(int i = n;i > 0;i -= lowbit(i)) {
res += c[i];
}
return res;
}
3、树状数组的更新操作

static void update(int k,int x) {
for(int i = k;i < c.length;i += lowbit(i)) {
c[i] += x;
}
}
4、树状数组的区间更新、区间查询
package 算法第二章_数据结构.树状数组;
public class 区间修改_区间查询 {
public static void main(String[] args) {
int[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int[] d = new int[a.length];
int[] da = new int[a.length];
int[] c1 = new int[a.length];
int[] c2 = new int[a.length];
for (int i = 1; i < d.length; i++) {
d[i] -= d[i + 1 == d.length ? 0 : i + 1] -= a[i];
da[i] = (i-1) * d[i];
}
for(int i = 1;i < d.length;i++) {
update(i,d[i],c1);
}
for(int i = 1;i < da.length;i++) {
update(i,da[i],c2);
}
System.out.println(sum(4,c1,c2) - sum(1,c1,c2));
updatePlus(2,4,3,c1,c2);
System.out.println(sum(4,c1,c2) - sum(1,c1,c2));
}
static int lowBit(int x){
return x & (-x);
}
static int sum(int n,int[] c){
int res = 0;
for(int i = n;i > 0;i -= lowBit(i)) {
res += c[i];
}
return res;
}
static void update(int i,int x,int[] c){
for(int j = i;j < c.length;j += lowBit(j)) {
c[j] += x;
}
}
static int sum(int n,int[] c1,int[] c2){
return n * sum(n,c1) - sum(n,c2);
}
static void updatePlus(int l,int r,int x,int[] c1,int[] c2){
update(l,x,c1);
update(r+1,-x,c1);
update(l,x * (l-1),c2);
update(r+1,-x * r,c2);
}
}