|
1 | 1 | #pragma once |
2 | 2 | #include "wavelet_bit_vec.hpp" |
3 | 3 | //! @code |
4 | | -//! vector<ull> a(n); |
5 | | -//! wavelet_matrix wm(a, 1e9); // requires a[i] <= 1e9 |
| 4 | +//! vector<ll> a(n); |
| 5 | +//! wavelet_matrix wm(a, 30); // 0 <= a[i] < (1<<30) |
6 | 6 | //! wm.kth(l, r, k); //(k+1)th smallest number in [l,r) |
7 | 7 | //! wm.kth(l, r, 0); //min in [l,r) |
8 | 8 | //! @endcode |
9 | | -//! @time O(n * log(max_val) + q * log(max_val)) |
10 | | -//! @space O(n * log(max_val) / 64) |
| 9 | +//! @time O(n * lg + q * lg) |
| 10 | +//! @space O(n * lg / 64) |
11 | 11 | struct wavelet_matrix { |
12 | 12 | int n; |
13 | 13 | vector<bit_vec> bv; |
14 | | - wavelet_matrix(vector<ull> a, ull max_val): |
15 | | - n(sz(a)), bv(bit_width(max_val), {{}}) { |
| 14 | + wavelet_matrix(vector<ll> a, int lg): |
| 15 | + n(sz(a)), bv(lg, {{}}) { |
16 | 16 | for (int h = sz(bv); h--;) { |
17 | | - int i = 0; |
18 | 17 | vector<bool> b(n); |
19 | | - ranges::stable_partition(a, |
20 | | - [&](ull x) { return b[i++] = (~x >> h) & 1; }); |
| 18 | + rep(i, 0, n) b[i] = (~a[i] >> h) & 1; |
21 | 19 | bv[h] = b; |
| 20 | + ranges::stable_partition(a, |
| 21 | + [&](ll x) { return (~x >> h) & 1; }); |
22 | 22 | } |
23 | 23 | } |
24 | | - ull kth(int l, int r, int k) { |
| 24 | + ll kth(int l, int r, int k) { |
25 | 25 | ll res = 0; |
26 | 26 | for (int h = sz(bv); h--;) { |
27 | 27 | int l0 = bv[h].cnt(l), r0 = bv[h].cnt(r); |
|
0 commit comments