@@ -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