From 9525d3763a215dad24eac1aeff7743cbc91063a0 Mon Sep 17 00:00:00 2001 From: Matuush Date: Tue, 18 Mar 2025 15:17:59 +0100 Subject: [PATCH] Line is represented by line number as key in treap --- file.hpp | 39 ++++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/file.hpp b/file.hpp index 3343a9b..5832190 100644 --- a/file.hpp +++ b/file.hpp @@ -4,12 +4,15 @@ using std::string; typedef unsigned long long priority_type; +typedef unsigned long long key_type; #define RAND_MAX (1 << 62) class line; typedef std::pair two_lines; +// Treap node representation of a line class line { priority_type priority; + key_type key; string text; line *left, *right; @@ -17,14 +20,30 @@ public: line(priority_type _p, string _t) : priority(_p), text(_t) {} two_lines split(string s) { return two_lines(nullptr, nullptr); } - void join(line *l) {} + void join(line *l) { + // Take minimum of priorities of roots + // Join subtrees + } - void insert(line *l) {} - void remove(string s) {} - line* find(string s) { return nullptr; } + line* find(key_type k) { + if(k < key) { + if(left != nullptr) + return left->find(k); + else + return nullptr; + } + else if(k > key) { + if(right != nullptr) + return right->find(k); + else + return nullptr; + } + else + return this; + } }; -// Treap file representation +// Treap representation of a file struct file { line* root; @@ -34,6 +53,12 @@ struct file { } void insert(string s) { line *l = new line(rand(), s); + + if(root == nullptr) { + root = l; + return; + } + auto two = root->split(s); two.first->join(l); two.first->join(two.second); @@ -43,7 +68,7 @@ struct file { two.first = two.first->split(s).first; // TODO sharp split two.first->join(two.second); } - line* find(string s) { - return root->find(s); + line* find(key_type k) { + return root->find(k); } };