11#ifndef WEILY_CODER_DS_TREAP_HPP
22#define WEILY_CODER_DS_TREAP_HPP
33
4+ /* *
5+ * @file treap.hpp
6+ * @brief Treap Data Structure
7+ */
8+
49#include " ../random.hpp"
510#include < functional>
611#include < limits>
914#include < vector>
1015
1116namespace weilycoder {
17+ /* *
18+ * @brief Base class for Treap data structure, providing random priority generation.
19+ */
1220struct treap_base {
1321private:
1422 static inline uint32_t rand32 = 0 ;
@@ -26,8 +34,7 @@ template <typename T> struct Treap : public treap_base {
2634 T value;
2735 uint32_t priority;
2836 size_t size, left, right;
29- node (const T &value)
30- : value(value), priority(get_rand()), size(1u ), left(null), right(null) {}
37+ node (const T &value) : value(value), priority(get_rand()), size(1u ), left(null), right(null) {}
3138 };
3239
3340 std::vector<size_t > free_list;
@@ -149,8 +156,7 @@ template <typename T> struct Treap : public treap_base {
149156 * @return A pair of roots of the left and right treaps.
150157 * @note If the treap has not maintained sorted order, the result is undefined.
151158 */
152- template <typename Compare = std::less<T>>
153- std::pair<size_t , size_t > lower_split (size_t p, const T &value) {
159+ template <typename Compare = std::less<T>> std::pair<size_t , size_t > lower_split (size_t p, const T &value) {
154160 constexpr Compare less;
155161 if (p == null)
156162 return {null, null};
@@ -177,8 +183,7 @@ template <typename T> struct Treap : public treap_base {
177183 * @return A pair of roots of the left and right treaps.
178184 * @note If the treap has not maintained sorted order, the result is undefined.
179185 */
180- template <typename Compare = std::less<T>>
181- std::pair<size_t , size_t > upper_split (size_t p, const T &value) {
186+ template <typename Compare = std::less<T>> std::pair<size_t , size_t > upper_split (size_t p, const T &value) {
182187 constexpr Compare less;
183188 if (p == null)
184189 return {null, null};
@@ -208,8 +213,7 @@ template <typename T> struct Treap : public treap_base {
208213 * @note If want to split all equal values into the middle treap,
209214 * use `lower_split` and `upper_split` instead.
210215 */
211- template <typename Compare = std::less<T>>
212- std::tuple<size_t , size_t , size_t > value_split (size_t p, const T &value) {
216+ template <typename Compare = std::less<T>> std::tuple<size_t , size_t , size_t > value_split (size_t p, const T &value) {
213217 constexpr Compare less;
214218 if (p == null)
215219 return {null, null, null};
@@ -257,8 +261,7 @@ template <typename T> struct Treap : public treap_base {
257261 * @return The index of the found node, or `null` if not found.
258262 * @note If the treap has not maintained sorted order, the result is undefined.
259263 */
260- template <typename Compare = std::less<T>>
261- size_t get_greater (size_t p, const T &value) const {
264+ template <typename Compare = std::less<T>> size_t get_greater (size_t p, const T &value) const {
262265 if (p == null)
263266 return null;
264267 constexpr Compare less;
@@ -278,8 +281,7 @@ template <typename T> struct Treap : public treap_base {
278281 * @return The index of the found node, or `null` if not found.
279282 * @note If the treap has not maintained sorted order, the result is undefined.
280283 */
281- template <typename Compare = std::less<T>>
282- size_t get_less (size_t p, const T &value) const {
284+ template <typename Compare = std::less<T>> size_t get_less (size_t p, const T &value) const {
283285 if (p == null)
284286 return null;
285287 constexpr Compare less;
@@ -299,8 +301,7 @@ template <typename T> struct Treap : public treap_base {
299301 * @return The number of elements less than the given value.
300302 * @note If the treap has not maintained sorted order, the result is undefined.
301303 */
302- template <typename Compare = std::less<T>>
303- size_t get_rank (size_t p, const T &value) const {
304+ template <typename Compare = std::less<T>> size_t get_rank (size_t p, const T &value) const {
304305 if (p == null)
305306 return 0 ;
306307 constexpr Compare less;
@@ -349,8 +350,7 @@ template <typename T> struct Treap : public treap_base {
349350 * @return The new root of the treap after insertion.
350351 * @note If the treap has not maintained sorted order, the result is undefined.
351352 */
352- template <typename Compare = std::less<T>>
353- size_t insert (size_t root, const T &value) {
353+ template <typename Compare = std::less<T>> size_t insert (size_t root, const T &value) {
354354 auto [left, right] = lower_split<Compare>(root, value);
355355 size_t newnode = new_node (value);
356356 return merge (merge (left, newnode), right);
@@ -365,8 +365,7 @@ template <typename T> struct Treap : public treap_base {
365365 * and a boolean indicating whether the insertion took place.
366366 * @note If the treap has not maintained sorted order, the result is undefined.
367367 */
368- template <typename Compare = std::less<T>>
369- std::pair<size_t , bool > insert_unique (size_t root, const T &value) {
368+ template <typename Compare = std::less<T>> std::pair<size_t , bool > insert_unique (size_t root, const T &value) {
370369 auto [left, mid, right] = value_split<Compare>(root, value);
371370 if (mid != null) {
372371 // Value already exists, do not insert
@@ -396,8 +395,7 @@ template <typename T> struct Treap : public treap_base {
396395 * @return The new root of the treap after erasure.
397396 * @note If the treap has not maintained sorted order, the result is undefined.
398397 */
399- template <typename Compare = std::less<T>>
400- size_t erase_value (size_t root, const T &value) {
398+ template <typename Compare = std::less<T>> size_t erase_value (size_t root, const T &value) {
401399 auto [left, mid, right] = value_split<Compare>(root, value);
402400 if (mid != null)
403401 free_list.push_back (mid);
@@ -413,8 +411,7 @@ template <typename T> struct Treap : public treap_base {
413411 * @return The new root of the treap after erasure.
414412 * @note If the treap has not maintained sorted order, the result is undefined.
415413 */
416- template <typename Compare = std::less<T>>
417- size_t erase_value_all (size_t root, const T &value) {
414+ template <typename Compare = std::less<T>> size_t erase_value_all (size_t root, const T &value) {
418415 auto [left, right] = lower_split<Compare>(root, value);
419416 auto [mid, rright] = upper_split<Compare>(right, value);
420417 erase_treap (mid);
0 commit comments