On this page
article
BIT 2D
Sobre
BIT de soma, update incrementa posicao
Tem que construir com um vetor com todos os pontos
que vc quer um dia atualizar (os pontos q vc vai chamar update)
Complexidades:
construir - O(n log(n))
update e query - O(log^2(n))
Link original: bit2d.cpp
Código
template<class T = int> struct bit2d {
vector<T> X;
vector<vector<T>> Y, t;
int ub(vector<T>& v, T x) {
return upper_bound(v.begin(), v.end(), x) - v.begin();
}
bit2d(vector<pair<T, T>> v) {
for (auto [x, y] : v) X.push_back(x);
sort(X.begin(), X.end());
X.erase(unique(X.begin(), X.end()), X.end());
t.resize(X.size() + 1);
Y.resize(t.size());
sort(v.begin(), v.end(), [](auto a, auto b) {
return a.second < b.second; });
for (auto [x, y] : v) for (int i = ub(X, x); i < t.size(); i += i&-i)
if (!Y[i].size() or Y[i].back() != y) Y[i].push_back(y);
for (int i = 0; i < t.size(); i++) t[i].resize(Y[i].size() + 1);
}
void update(T x, T y, T v) {
for (int i = ub(X, x); i < t.size(); i += i&-i)
for (int j = ub(Y[i], y); j < t[i].size(); j += j&-j) t[i][j] += v;
}
T query(T x, T y) {
T ans = 0;
for (int i = ub(X, x); i; i -= i&-i)
for (int j = ub(Y[i], y); j; j -= j&-j) ans += t[i][j];
return ans;
}
T query(T x1, T y1, T x2, T y2) {
return query(x2, y2)-query(x2, y1-1)-query(x1-1, y2)+query(x1-1, y1-1);
}
};