#include<bits/stdc++.h> #define ll long long // Usage: // BIT2D_Sum bit(n, m); // bit.clear_for(n, m); // bit.update_point(x, y, v); // summ = bit.query(x1, y1, x2, y2); template <typename T> struct BIT2D_Sum { int n, m; T **BIT; BIT2D_Sum(int n_, int m_) { n = n_; m = m_; BIT = new T*[n+1]; for (int i = 0; i <= n; ++i) { BIT[i] = new T[m+1]; fill(BIT[i], BIT[i] + m + 1, 0); } } void clear_for(int n_, int m_) { n = n_; m = m_; for (int i = 0; i <= n; ++i) { fill(BIT[i], BIT[i] + m + 1, 0); } } void update_point(int posx, int posy, T v) { for (int x = posx; x <= n; x += x&(-x)) for (int y = posy; y <= m; y += y&(-y)) BIT[x][y] += v; } T query(int posx, int posy) { T res = 0; for (int x = posx; x > 0; x -= x&(-x)) for (int y = posy; y > 0; y-= y&(-y)) res += BIT[x][y]; return res; } T query(int x1, int y1, int x2, int y2) { return query(x2, y2) - query(x2, y1-1) - query(x1-1, y2) + query(x1-1, y1-1); } };