Skip to content

Commit d5e1333

Browse files
committed
refactor: Rename and restructure initialization methods in SegmentTree for clarity and efficiency
1 parent 79623d3 commit d5e1333

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

weilycoder/ds/segment_tree.hpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,48 @@ template <typename Monoid, typename ptr_t = size_t> struct SegmentTree {
4040
Monoid::operation(data[data[node].left].value, data[data[node].right].value);
4141
}
4242

43-
ptr_t build(ptr_t l, ptr_t r) {
43+
ptr_t init(ptr_t l, ptr_t r) {
4444
ptr_t node = data.size();
4545
data.emplace_back();
4646

4747
if (r - l > 1) {
4848
ptr_t mid = l + ((r - l) >> 1);
49-
ptr_t left = build(l, mid), right = build(mid, r);
49+
ptr_t left = init(l, mid), right = init(mid, r);
5050
data[node].left = left, data[node].right = right;
5151
}
5252

5353
return node;
5454
}
5555

56-
void init(ptr_t node, ptr_t l, ptr_t r, const std::vector<T> &arr) {
56+
ptr_t init(ptr_t l, ptr_t r, const std::vector<T> &arr) {
57+
ptr_t node = data.size();
58+
data.emplace_back();
59+
5760
if (r - l == 1)
5861
data[node].value = arr[l];
5962
else {
6063
ptr_t mid = l + ((r - l) >> 1);
61-
init(data[node].left, l, mid, arr);
62-
init(data[node].right, mid, r, arr);
64+
ptr_t left = init(l, mid, arr);
65+
ptr_t right = init(mid, r, arr);
66+
data[node].left = left, data[node].right = right;
6367
pushup(node);
6468
}
69+
70+
return node;
71+
}
72+
73+
void build(ptr_t l, ptr_t r) {
74+
if (r - l > 0) {
75+
data.reserve((r - l) * 2 - 1);
76+
init(l, r);
77+
}
78+
}
79+
80+
void build(const std::vector<T> &arr) {
81+
if (!arr.empty()) {
82+
data.reserve(arr.size() * 2 - 1);
83+
init(0, arr.size(), arr);
84+
}
6585
}
6686

6787
void point_set(ptr_t node, ptr_t l, ptr_t r, ptr_t pos, const T &val) {
@@ -131,7 +151,7 @@ template <typename Monoid, typename ptr_t = size_t> struct SegmentTree {
131151
*/
132152
explicit SegmentTree(const std::vector<T> &arr)
133153
: tl(0), tr(static_cast<ptr_t>(arr.size())) {
134-
build(tl, tr), init(0, tl, tr, arr);
154+
build(arr);
135155
}
136156

137157
/**
@@ -178,6 +198,9 @@ template <typename Monoid, typename ptr_t = size_t> struct SegmentTree {
178198
throw std::out_of_range("SegmentTree::range_query: range out of bounds");
179199
return range_query(0, tl, tr, left, right);
180200
}
201+
202+
ptr_t left() const { return tl; }
203+
ptr_t right() const { return tr; }
181204
};
182205
} // namespace weilycoder
183206

0 commit comments

Comments
 (0)