public class Code_IndexTree2D {
private int[][] tree;
private int[][] nums;
private int N;
private int M;
public Code_IndexTree2D(int[][] matrix){
if(matrix.length == 0 || matrix[0].length == 0){
return ;
}
N = matrix.length;
M = matrix[0].length;
tree = new int[N+1][M+1]; // 第i行,第j列表示从 (1,1)位置到(i,j)形成的矩形的整体的和
nums = new int[N][M]; // 保存上一次更新的值
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
update(i,j,matrix[i][j]);
}
}
}
public void update(int row, int col, int val){
if(N == 0 || M == 0){
return ;
}
int add = val - nums[row][col];
nums[row][col] = val;
for (int i = row+1; i <= N; i += (i & -i)) {
for (int j = col+1; j <=M ; j += (j & -j)) {
tree[i][j] += add;
}
}
}
private int sum(int row, int col){
int ans = 0;
for (int i = row+1; i > 0; i -= (i & -i)) {
for (int j = col+1; j > 0; j -= (j & -j)) {
ans += tree[i][j];
}
}
return ans;
}
// 求(row1,col1) 与 (row1,col2)形成的矩形的和
public int sumRegion(int row1, int col1, int row2, int col2) {
if (N == 0 || M == 0) {
return 0;
}
return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1);
}
public static void main(String[] args) {
int[][] matrix = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
Code_IndexTree2D indexTree2D = new Code_IndexTree2D(matrix);
for (int i = 0; i < indexTree2D.tree.length; i++) {
for (int j = 0; j < indexTree2D.tree[0].length; j++) {
System.out.print(indexTree2D.tree[i][j]+" ");
}
System.out.println();
}
System.out.println(indexTree2D.sumRegion(0,0,2,2));
}
}