src/ds/rmq/rus4/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../st/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | template <class T, auto op> | ||
| 8 | class rus4_st { | ||
| 9 | u32 sz, B; | ||
| 10 | st_array<T, op> st; | ||
| 11 | vec<st_array<T, op>> d; | ||
| 12 | |||
| 13 | public: | ||
| 14 | 16 | CEXPE rus4_st(spn<T> a) NE : rus4_st(a, (u32)std::bit_width(a.size())) {} | |
| 15 | 16 | CEXP rus4_st(spn<T> a, u32 block_size) NE { reset(a, block_size); } | |
| 16 | |||
| 17 | 16 | CEXP void reset(spn<T> a, u32 block_size) NE { | |
| 18 | 16 | sz = (u32)a.size(), B = block_size, d.clear(); | |
| 19 | 16 | vec<T> ds; | |
| 20 |
2/2✓ Branch 0 taken 374871 times.
✓ Branch 1 taken 16 times.
|
374887 | for (u32 l = 0; l < sz; l += B) { |
| 21 |
2/2✓ Branch 0 taken 374855 times.
✓ Branch 1 taken 16 times.
|
374871 | d.emplace_back(a.subspan(l, l + B > sz ? std::dynamic_extent : B)); |
| 22 | 374871 | ds.push_back(d.back().query()); | |
| 23 | } | ||
| 24 | 16 | st.reset(ds); | |
| 25 | 16 | } | |
| 26 | ND CEXP u32 CR block_size() CNE { return B; } | ||
| 27 | 6831133 | ND CEXP u32 CR size() CNE { return sz; } | |
| 28 | CEXP T query(u32 l = 0) CNE { return query(l, size()); } | ||
| 29 | //! 0-indexed, [l, r) | ||
| 30 | 6831133 | CEXP T query(u32 l, u32 r) CNE { | |
| 31 |
2/4✓ Branch 0 taken 6831133 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 6831133 times.
✗ Branch 4 not taken.
|
6831133 | assert(l < r && r <= size()); |
| 32 |
2/2✓ Branch 0 taken 204870 times.
✓ Branch 1 taken 6626263 times.
|
6831133 | if (u32 L = l / B, R = r / B; L == R) return d[L].query(l % B, r % B); |
| 33 | else { | ||
| 34 | 6626263 | T ret = d[L].query(l % B); | |
| 35 |
2/2✓ Branch 0 taken 6193558 times.
✓ Branch 1 taken 432705 times.
|
6626263 | if (L + 1 != R) ret = op(ret, st.query(L + 1, R)); |
| 36 |
2/2✓ Branch 0 taken 6263020 times.
✓ Branch 1 taken 363243 times.
|
6626263 | if (r % B) ret = op(ret, d[R].query(0, r % B)); |
| 37 | 6626263 | return ret; | |
| 38 | } | ||
| 39 | } | ||
| 40 | }; | ||
| 41 | |||
| 42 | } // namespace tifa_libs | ||
| 43 |