summaryrefslogtreecommitdiff
path: root/datastructures/waveletTree.cpp
diff options
context:
space:
mode:
authorNoobie99 <noob999noob999@gmail.com>2023-04-05 23:02:19 +0200
committerNoobie99 <noob999noob999@gmail.com>2023-04-05 23:02:19 +0200
commit5823edfb6b3fe8ea8b1e8e3e4a5cbdad2280bfcd (patch)
tree94447b781b9d588070efdd32e8d87e719546aba4 /datastructures/waveletTree.cpp
parentc93c7956ebf2d572ea8fb341a636b60e6f97ad84 (diff)
improved wavelet tree
Diffstat (limited to 'datastructures/waveletTree.cpp')
-rw-r--r--datastructures/waveletTree.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/datastructures/waveletTree.cpp b/datastructures/waveletTree.cpp
index 4860a40..c211b0f 100644
--- a/datastructures/waveletTree.cpp
+++ b/datastructures/waveletTree.cpp
@@ -4,19 +4,19 @@ struct WaveletTree {
vector<int> b = {0};
ll lo, hi;
- WaveletTree(vector<ll> a) : WaveletTree(all(a), // call this
- *min_element(all(a)), *max_element(all(a)) + 1) {}
+ WaveletTree(vector<ll> in) : WaveletTree(all(in)) {}
- WaveletTree(it from, it to, ll x, ll y) : lo(x), hi(y) {
- if (lo + 1 >= hi || from == to) return;
+ WaveletTree(it from, it to) : // call above one
+ lo(*min_element(from, to)), hi(*max_element(from, to) + 1) {
+ if (lo + 1 >= hi) return;
ll mid = (lo + hi) / 2;
auto f = [&](ll x){return x < mid;};
for (it c = from; c != to; c++) {
b.push_back(b.back() + f(*c));
}
it pivot = stable_partition(from, to, f);
- ln = new WaveletTree(from, pivot, lo, mid);
- rn = new WaveletTree(pivot, to, mid, hi);
+ ln = new WaveletTree(from, pivot);
+ rn = new WaveletTree(pivot, to);
}
// kth element in sort[l, r) all 0-indexed
@@ -32,8 +32,8 @@ struct WaveletTree {
int countSmaller(int l, int r, ll k) {
if (l >= r || k <= lo) return 0;
if (hi <= k) return r - l;
- return ln->countSmaller(b[l], b[r], k) +
- rn->countSmaller(l-b[l], r-b[r], k);
+ return ln->countSmaller(b[l], b[r], k) +
+ rn->countSmaller(l-b[l], r-b[r], k);
}
~WaveletTree() {delete ln; delete rn;}