src/ds/bst/fhq_w/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../util/alias/others/lib.hpp" | ||
| 4 | #include "../../../util/rand/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <class T, auto op, auto e, class F, auto mapping, auto composition, auto id, | ||
| 9 | bool reverse_ = false, bool recovery = false> | ||
| 10 | requires requires(T val, T val_l, T val_r, F tag, F tag_l, F tag_r) { | ||
| 11 | { e() } -> std::same_as<T>; | ||
| 12 | { id() } -> std::same_as<F>; | ||
| 13 | { op(val_l, val_r) } -> std::same_as<T>; | ||
| 14 | { mapping(tag, val) } -> std::same_as<T>; | ||
| 15 | { composition(tag_l, tag_r) } -> std::same_as<F>; | ||
| 16 | } | ||
| 17 | class fhq_treap_w { | ||
| 18 | //! initial cnt = 1; | ||
| 19 | struct TIFA { | ||
| 20 | T w, val; | ||
| 21 | F sign; | ||
| 22 | u32 sz; | ||
| 23 | arr<u32, 2> son{}; | ||
| 24 | i32 rad; | ||
| 25 | bool rev{false}; | ||
| 26 | 39750757 | CEXP TIFA(T W = e(), T VAL = e(), u32 SZ = 0, i32 RAD = 0, F SIGN = id()) NE : w(W), val(VAL), sign(SIGN), sz(SZ), rad(RAD) {} | |
| 27 | }; | ||
| 28 | rand_gen<i32> gen; | ||
| 29 | vec<TIFA> t; | ||
| 30 | vecu sta; | ||
| 31 | u32 cnt{0}; | ||
| 32 | |||
| 33 | 14820801 | CEXP u32 newnode(T val) NE { | |
| 34 | u32 ret; | ||
| 35 |
2/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::newnode(long):
✗ Branch 1 not taken.
✓ Branch 2 taken 4639492 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::newnode(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>):
✗ Branch 1 not taken.
✓ Branch 2 taken 10181309 times.
|
14820801 | if (sta.size()) ret = *sta.rbegin(), sta.pop_back(), t[ret] = TIFA(val, val, 1, gen()); |
| 36 | 14820801 | else ret = ++cnt, t[ret] = TIFA(val, val, 1, gen()); | |
| 37 | 14820801 | return ret; | |
| 38 | } | ||
| 39 | CEXP void rm(u32 u) NE { sta.push_back(u); } | ||
| 40 | 1242940691 | CEXP void update(u32 u) NE { | |
| 41 | 1242940691 | t[u].w = op(t[t[u].son[0]].w, op(t[u].val, t[t[u].son[1]].w)); | |
| 42 | 1242940691 | t[u].sz = t[t[u].son[0]].sz + t[t[u].son[1]].sz + 1; | |
| 43 | 1242940691 | } | |
| 44 | 144317650 | CEXP void reverse__(u32 u) NE { | |
| 45 | static_assert(reverse_); | ||
| 46 | 144317650 | swap(t[u].son[0], t[u].son[1]), t[u].rev ^= 1; | |
| 47 | 144317650 | } | |
| 48 | 3784449575 | CEXP void all_update(u32 u, F f) NE { | |
| 49 |
4/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::all_update(unsigned int, long):
✓ Branch 0 taken 1332571977 times.
✓ Branch 1 taken 267754821 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::all_update(unsigned int, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >):
✓ Branch 0 taken 1779993867 times.
✓ Branch 1 taken 404128910 times.
|
3784449575 | if (u) { |
| 50 | 3112565844 | t[u].val = mapping(f, t[u].val); | |
| 51 | 3112565844 | t[u].w = mapping(f, t[u].w); | |
| 52 | 3112565844 | t[u].sign = composition(f, t[u].sign); | |
| 53 | } | ||
| 54 | 3784449575 | } | |
| 55 | 1939274411 | CEXP void pushdown(u32 u) NE { | |
| 56 |
4/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::pushdown(unsigned int):
✓ Branch 0 taken 798953166 times.
✓ Branch 1 taken 18963418 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::pushdown(unsigned int):
✓ Branch 0 taken 1091527693 times.
✓ Branch 1 taken 29830134 times.
|
1939274411 | if (u) { |
| 57 | 1890480859 | all_update(t[u].son[0], t[u].sign); | |
| 58 | 1890480859 | all_update(t[u].son[1], t[u].sign); | |
| 59 | 1890480859 | t[u].sign = id(); | |
| 60 | if CEXP (reverse_) | ||
| 61 |
3/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::pushdown(unsigned int):
✗ Branch 1 not taken.
✓ Branch 2 taken 798953166 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::pushdown(unsigned int):
✓ Branch 1 taken 71625458 times.
✓ Branch 2 taken 1019902235 times.
|
1890480859 | if (t[u].rev) reverse__(t[u].son[0]), reverse__(t[u].son[1]), t[u].rev = 0; |
| 62 | } | ||
| 63 | 1939274411 | } | |
| 64 | |||
| 65 | public: | ||
| 66 | u32 root{0}; | ||
| 67 | |||
| 68 | 168 | CEXPE fhq_treap_w(u32 MAX_N) NE : gen(), t(MAX_N + 1), sta() { | |
| 69 | if CEXP (recovery) sta.reserve(MAX_N + 1); | ||
| 70 | 56 | } | |
| 71 | |||
| 72 | 679233072 | CEXP void split(u32 u, u32 k, u32& x, u32& y) NE { | |
| 73 |
4/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::split(unsigned int, unsigned int, unsigned int&, unsigned int&):
✓ Branch 0 taken 14323926 times.
✓ Branch 1 taken 277620508 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::split(unsigned int, unsigned int, unsigned int&, unsigned int&):
✓ Branch 0 taken 20715073 times.
✓ Branch 1 taken 366573565 times.
|
679233072 | if (!u) x = y = 0; |
| 74 |
4/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::split(unsigned int, unsigned int, unsigned int&, unsigned int&):
✓ Branch 4 taken 176104652 times.
✓ Branch 5 taken 101515856 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::split(unsigned int, unsigned int, unsigned int&, unsigned int&):
✓ Branch 4 taken 199553641 times.
✓ Branch 5 taken 167019924 times.
|
644194073 | else if (pushdown(u); t[t[u].son[0]].sz < k) { |
| 75 | 375658293 | x = u; | |
| 76 | 375658293 | split(t[u].son[1], k - t[t[u].son[0]].sz - 1, t[x].son[1], y); | |
| 77 | 375658293 | update(x); | |
| 78 | 268535780 | } else y = u, split(t[u].son[0], k, x, t[y].son[0]), update(y); | |
| 79 | 679233072 | } | |
| 80 | 647540169 | CEXP u32 merge(u32 x, u32 y) NE { | |
| 81 | 647540169 | pushdown(x), pushdown(y); | |
| 82 |
8/8tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::merge(unsigned int, unsigned int):
✓ Branch 0 taken 262237536 times.
✓ Branch 1 taken 7910502 times.
✓ Branch 2 taken 251184620 times.
✓ Branch 3 taken 11052916 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::merge(unsigned int, unsigned int):
✓ Branch 0 taken 364681277 times.
✓ Branch 1 taken 12710854 times.
✓ Branch 2 taken 347561998 times.
✓ Branch 3 taken 17119279 times.
|
647540169 | if (x && y) { |
| 83 |
4/4tifa_libs::fhq_treap_w<long, &(op(long, long)), &(e()), long, &(mapping(long, long)), &(composition(long, long)), &(id()), true, false>::merge(unsigned int, unsigned int):
✓ Branch 2 taken 159525284 times.
✓ Branch 3 taken 91659336 times.
tifa_libs::fhq_treap_w<std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, &(op(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(e()), std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, &(mapping(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, unsigned long>)), &(composition(std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >, std::pair<tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> >, tifa_libs::mint_impl_::mint<tifa_libs::mint_ms_tag<998244353ul> > >)), &(id()), true, false>::merge(unsigned int, unsigned int):
✓ Branch 2 taken 204465918 times.
✓ Branch 3 taken 143096080 times.
|
598746618 | if (t[x].rad <= t[y].rad) { |
| 84 | 363991202 | t[x].son[1] = merge(t[x].son[1], y), update(x); | |
| 85 | 363991202 | return x; | |
| 86 | } | ||
| 87 | 234755416 | t[y].son[0] = merge(x, t[y].son[0]), update(y); | |
| 88 | 234755416 | return y; | |
| 89 | 48793551 | } else return x + y; | |
| 90 | } | ||
| 91 | 14820801 | CEXP void insert(T w, u32 id_) NE { | |
| 92 | u32 x, y; | ||
| 93 | 14820801 | split(root, id_, x, y), root = merge(merge(x, newnode(w)), y); | |
| 94 | 14820801 | } | |
| 95 | 10254858 | CEXP void insert(T w) NE { insert(w, cnt); } | |
| 96 | 1066249 | CEXP void erase(u32 id_) NE { | |
| 97 | u32 x, y, z; | ||
| 98 | 1066249 | split(root, id_, x, y), split(y, 1, z, y); | |
| 99 | if CEXP (recovery) rm(z); | ||
| 100 | 1066249 | root = merge(x, y); | |
| 101 | 1066249 | } | |
| 102 | 3487857 | CEXP void update(u32 l, u32 r, F f) NE { | |
| 103 | u32 x, y, z; | ||
| 104 | 3487857 | split(root, r + 1, x, z), split(x, l, x, y); | |
| 105 | 3487857 | all_update(y, f), root = merge(merge(x, y), z); | |
| 106 | 3487857 | } | |
| 107 | 1066734 | CEXP void reverse(u32 l, u32 r) NE { | |
| 108 | static_assert(reverse_); | ||
| 109 | u32 x, y, z; | ||
| 110 | 1066734 | split(root, r + 1, x, z), split(x, l, x, y); | |
| 111 | 1066734 | reverse__(y), root = merge(merge(x, y), z); | |
| 112 | 1066734 | } | |
| 113 | 4488259 | ND CEXP T query(u32 l, u32 r) NE { | |
| 114 | u32 x, y, z; | ||
| 115 | 4488259 | split(root, r + 1, x, z), split(x, l, x, y); | |
| 116 | 4488259 | T ret = t[y].w; | |
| 117 | 4488259 | root = merge(merge(x, y), z); | |
| 118 | 4488259 | return ret; | |
| 119 | } | ||
| 120 | }; | ||
| 121 | |||
| 122 | } // namespace tifa_libs | ||
| 123 |