1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream> #include <vector>
using namespace std;
struct Solution { Solution(const vector<vector<int>> &mtx) : mtx(mtx) { int n = mtx.size(), m = mtx[0].size(); BIT.resize(n + 1, vector<int>(m + 1)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { helper(i, j, mtx[i][j]); } } }
int query(int i, int j) { ++i, ++j; int sum = 0; while (i > 0) { int t = j; while (t > 0) { sum += BIT[i][t]; t -= (t & -t); } i -= (i & -i); } return sum; }
int query(int uli, int ulj, int lri, int lrj) { return query(lri, lrj) - query(lri, ulj - 1) - query(uli - 1, lrj) + query(uli - 1, ulj - 1); }
void helper(int i, int j, int val) { ++i, ++j; while (i < BIT.size()) { int t = j; while (t < BIT[i].size()) { BIT[i][t] += val; t += (t & -t); } i += (i & -i); } }
void update(int i, int j, int val) { helper(i, j, val - mtx[i][j]); mtx[i][j] = val; }
vector<vector<int>> mtx, BIT; };
int main() { vector<vector<int>> mtx = { {3, 2, 2, 8, 1, 6, 4}, {4, 2, 7, 0, 2, 8, 1}, {2, 9, 1, 6, 5, 5, 5}, {2, 7, 4, 4, 1, 4, 8}, {0, 4, 7, 1, 2, 5, 8}, {7, 2, 8, 2, 1, 6, 9} }; Solution s(mtx); cout << s.query(0, 0, 5, 6) << endl; cout << s.query(2, 3, 3, 5) << endl; s.update(4, 2, 8); cout << s.query(0, 0, 5, 6) << endl; cout << s.query(1, 2, 4, 5) << endl;
return 0; }
|