GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 18 / 0 / 18
Functions: 100.0% 5 / 0 / 5
Branches: 85.7% 12 / 0 / 14

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