From 61f468c15029c68aaa35a384b1cec17a56976638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Sun, 17 Apr 2022 13:57:09 +0200 Subject: [PATCH] check integrity of tree. fix bug regarding updating --- segment_tree.cpp | 39 ++++++++++++++++++++++++++++++--------- segment_tree.h | 1 + 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/segment_tree.cpp b/segment_tree.cpp index 6fcd570..a985d2c 100644 --- a/segment_tree.cpp +++ b/segment_tree.cpp @@ -35,8 +35,9 @@ SegmentTree::SegmentTree(const std::vector &coords): } void SegmentTree::add_interval(Interval interval) { + check_integrity(); std::stack visit_to; - std::vector update_to; + std::stack update_to; visit_to.push(0); while(!visit_to.empty()) { Index node_idx = visit_to.top(); @@ -51,18 +52,21 @@ void SegmentTree::add_interval(Interval interval) { visit_to.push(right_child_idx(node_idx)); } if(!_nodes[node_idx].covered()) { - update_to.push_back(node_idx); + update_to.push(node_idx); } } } - for(auto update_idx : update_to) { - update_covered_length(update_idx); + while(!update_to.empty()) { + update_covered_length(update_to.top()); + update_to.pop(); } + check_integrity(); } void SegmentTree::remove_interval(Interval interval) { + check_integrity(); std::stack visit_to; - std::vector update_to; + std::stack update_to; visit_to.push(0); while(!visit_to.empty()) { Index node_idx = visit_to.top(); @@ -77,11 +81,28 @@ void SegmentTree::remove_interval(Interval interval) { visit_to.push(right_child_idx(node_idx)); } if(!_nodes[node_idx].covered()) { - update_to.push_back(node_idx); + update_to.push(node_idx); } } } - for(auto update_idx : update_to) { - update_covered_length(update_idx); + while(!update_to.empty()) { + update_covered_length(update_to.top()); + update_to.pop(); } -} \ No newline at end of file + check_integrity(); +} + +void SegmentTree::check_integrity() { + for(Index node_idx = 0 ; node_idx < _nodes.size(); ++node_idx) { + if(_nodes[node_idx].covered()) { + assert(_nodes[node_idx].covered_length == _nodes[node_idx].segment_length()); + } else { + if(is_leaf(node_idx)) { + assert(_nodes[node_idx].covered_length == 0); + } else { + assert(_nodes[node_idx].covered_length == \ + left_child(node_idx).covered_length + right_child(node_idx).covered_length); + } + } + } +} diff --git a/segment_tree.h b/segment_tree.h index d070556..2ee53d3 100644 --- a/segment_tree.h +++ b/segment_tree.h @@ -33,6 +33,7 @@ public: inline Unit length_covered_intervals(); void add_interval(Interval interval); void remove_interval(Interval interval); + void check_integrity(); private: inline static Index left_child_idx(Index node_idx);