rustgym 0.2.0

rustgym solutions
Documentation
struct NumMatrix {
    matrix: Vec<Vec<i32>>,
    sum: Vec<Vec<i32>>,
    n: usize,
    m: usize,
}

impl NumMatrix {
    fn new(matrix: Vec<Vec<i32>>) -> Self {
        let n = matrix.len();
        if n == 0 {
            return NumMatrix {
                matrix,
                sum: vec![],
                n: 0,
                m: 0,
            };
        }
        let m = matrix[0].len();
        let mut sum = vec![vec![0; m + 1]; n + 1];
        for i in 0..n {
            for j in 0..m {
                sum[i + 1][j + 1] = matrix[i][j];
                sum[i + 1][j + 1] += sum[i + 1][j];
                sum[i + 1][j + 1] += sum[i][j + 1];
                sum[i + 1][j + 1] -= sum[i][j];
            }
        }
        NumMatrix { matrix, sum, n, m }
    }

    fn sum_region(&self, row1: i32, col1: i32, row2: i32, col2: i32) -> i32 {
        let r1 = row1 as usize;
        let c1 = col1 as usize;
        let r2 = row2 as usize + 1;
        let c2 = col2 as usize + 1;
        let mut res = 0;
        res += self.sum[r2][c2];
        res -= self.sum[r1][c2];
        res -= self.sum[r2][c1];
        res += self.sum[r1][c1];
        res
    }
}

#[test]
fn test() {
    let matrix = vec_vec_i32![
        [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]
    ];
    let nm = NumMatrix::new(matrix);
    assert_eq!(nm.sum_region(2, 1, 4, 3), 8);
}