树状数组
template <typename T>struct Fenwick { const int n; vector<T> a; Fenwick(int n): n(n), a(n + 1) {} void add(int x, T v){ for(int i = x; i <= n; i += i & -i) a[i] += v; } T sum(int x) { T rs = 0; for(int i = x; i; i -= i & -i) { rs += a[i]; } return rs; } T rangeSum(int l, int r) { if(l > r) return 0; return sum(r) - sum(l - 1); }};
二维树状数组
template<class T>class Fenwick2D { int n, m; vector<vector<T>> c;public: Fenwick2D() {} Fenwick2D(int n, int m): n(n), m(m) { c.resize(n + 1, vector<int>(m + 1, 0)); } void add(int x, int y, T val) { for(int i = x; i <= n; i += i & -i) { for(int j = y; j <= m; j += j & -j) { c[i][j] += val; } } } int sum(int x, int y) { T rs = 0; for(int i = x; i; i -= i & -i) { for(int j = y; j; j -= j & -j) { rs += c[i][j]; } } return rs; } int sum(int x0, int y0, int x, int y) { return sum(x, y) - sum(x0 - 1, y) - sum(x, y0 - 1) + sum(x0 - 1, y0 - 1); }};
例题
- https://leetcode-cn.com/problems/range-sum-query-2d-mutable/