On this page
article
BIT-Sort Tree
Sobre
Tipo uma MergeSort Tree usando Bit
Apesar da complexidade ser pior, fica melhor na pratica.
query(l, r, k) retorna o numero de elementos menores que k
no intervalo [l, r]
Usa O(n log(n)) de memoria
Complexidades:
construir - O(n log^2(n))
query - O(log^2(n))
Link original: bitSortTree.cpp
Código
template<typename T> struct ms_bit {
int n;
vector<vector<T>> bit;
ms_bit(vector<T>& v) : n(v.size()), bit(n+1) {
for (int i = 0; i < n; i++)
for (int j = i+1; j <= n; j += j&-j)
bit[j].push_back(v[i]);
for (int i = 1; i <= n; i++)
sort(bit[i].begin(), bit[i].end());
}
int p_query(int i, T k) {
int ret = 0;
for (i++; i; i -= i&-i)
ret += lower_bound(bit[i].begin(), bit[i].end(), k) - bit[i].begin();
return ret;
}
int query(int l, int r, T k) {
return p_query(r, k) - p_query(l-1, k);
}
};