1.一维树状数组
// 获得2^k
public static int lowbit(int i) {
return i & -i;
}
//修改结点
public static void add(int i, int value) {
while (i <= MAX) {
c[i] += value;
i += lowbit(i);
}
}
//求和
public static int getSum(int i) {
int sum = 0;
while (i > 0) {
sum += c[i];
i -= lowbit(i);
}
return sum;
}
2.二维树状数组
public static int lowbit(int i) {
return i & -i;
}
public static void change(int i, int j, int value) {
while (i <= n) {
int temp = j;
while (temp <= n) {
matrix[i][temp] += value;
temp += lowbit(temp);
}
i += lowbit(i);
}
}
public static int getSum(int i, int j) {
int sum = 0;
while (i > 0) {
int tmp = j;
while (tmp > 0) {
sum += matrix[i][tmp];
tmp -= lowbit(tmp);
}
i -= lowbit(i);
}
return sum;
}