Given a 2D matrix `matrix`, handle multiple queries of the following types: 1. **Update** the value of a cell in `matrix`. 2. Calculate the **sum** of the elements of `matrix` inside the rectangle defined by its **upper left corner** `(row1, col1)` and **lower right corner** `(row2, col2)`. Implement the `NumMatrix` class: - `NumMatrix(int[][] matrix)` Initializes the object with the integer matrix `matrix`. - `void update(int row, int col, int val)` **Updates** the value of `matrix[row][col]` to be `val`. - `int sumRegion(int row1, int col1, int row2, int col2)` Returns the **sum** of the elements of `matrix` inside the rectangle defined by its upper left corner `(row1, col1)` and lower right corner `(row2, col2)`.
Example 1
Input: operations = ["NumMatrix","sumRegion","update","sumRegion"], args = [[[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]],[2,1,4,3],[3,2,2],[2,1,4,3]]
Output: [null,8,null,10]
Explanation: The region sum is 8; after setting cell (3,2) to 2 it becomes 10.
Example 2
Input: operations = ["NumMatrix","sumRegion"], args = [[[[1,2],[3,4]]],[0,0,1,1]]
Output: [null,10]
Explanation: The whole matrix sums to 1+2+3+4 = 10.
Example 3
Input: operations = ["NumMatrix","update","sumRegion"], args = [[[[1,2],[3,4]]],[0,0,10],[0,0,0,0]]
Output: [null,null,10]
Explanation: update(0,0,10) replaces the 1 in the top-left corner with 10, so the 1 x 1 region at (0,0) now sums to 10.
Extend the 1-D Fenwick idea to two dimensions: each tree cell stores the sum of a sub-rectangle. A point update and a prefix-rectangle query each touch O(log m · log n) nodes; a rectangle sum is four prefix queries by inclusion-exclusion.
Run checks all cases above. Submit evaluates all test cases.