Skip to content

Commit 8402d12

Browse files
Support 4-args merge function in lazy_segment_tree_from_node and typical_segment_tree_from_node; release 0.5.1
1 parent 4e295ad commit 8402d12

File tree

4 files changed

+35
-21
lines changed

4 files changed

+35
-21
lines changed

library/example/Luogu_P3373.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// mp-oi-library extension note: start. Do not modify this part.
2-
// mp-oi-library extension header: library version: @MrPython-0.4.2
2+
// mp-oi-library extension header: library version: @MrPython-0.5.1
33
// mp-oi-library extension note: file bits.hpp
44
#ifndef MP_LIBRARY_BITS
55
#define MP_LIBRARY_BITS
@@ -284,18 +284,24 @@ template <typename NodeStruct> class lazy_segment_tree_from_node {
284284
using T = typename NodeStruct::T;
285285
using Lazy = typename NodeStruct::Lazy;
286286
struct MergeFunction {
287-
T operator()(T const& a, T const& b) const {
288-
return NodeStruct::merge_data(a, b);
287+
template <typename... Args>
288+
auto operator()(Args&&... args) const
289+
-> decltype(NodeStruct::merge_data(std::forward<Args>(args)...)) {
290+
return NodeStruct::merge_data(std::forward<Args>(args)...);
289291
}
290292
};
291293
struct OperateFunction {
292-
T operator()(Lazy const& lazy, T const& data, size_t size) const {
293-
return NodeStruct::operate(lazy, data, size);
294+
template <typename... Args>
295+
auto operator()(Args&&... args) const
296+
-> decltype(NodeStruct::operate(std::forward<Args>(args)...)) {
297+
return NodeStruct::operate(std::forward<Args>(args)...);
294298
}
295299
};
296300
struct MergeLazyFunction {
297-
Lazy operator()(Lazy const& a, Lazy const& b) const {
298-
return NodeStruct::merge_lazy(a, b);
301+
template <typename... Args>
302+
auto operator()(Args&&... args) const
303+
-> decltype(NodeStruct::merge_lazy(std::forward<Args>(args)...)) {
304+
return NodeStruct::merge_lazy(std::forward<Args>(args)...);
299305
}
300306
};
301307
lazy_segment_tree_from_node() = delete;

library/mrpython/lazy_segment_tree.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,18 +227,24 @@ template <typename NodeStruct> class lazy_segment_tree_from_node {
227227
using T = typename NodeStruct::T;
228228
using Lazy = typename NodeStruct::Lazy;
229229
struct MergeFunction {
230-
T operator()(T const& a, T const& b) const {
231-
return NodeStruct::merge_data(a, b);
230+
template <typename... Args>
231+
auto operator()(Args&&... args) const
232+
-> decltype(NodeStruct::merge_data(std::forward<Args>(args)...)) {
233+
return NodeStruct::merge_data(std::forward<Args>(args)...);
232234
}
233235
};
234236
struct OperateFunction {
235-
T operator()(Lazy const& lazy, T const& data, size_t size) const {
236-
return NodeStruct::operate(lazy, data, size);
237+
template <typename... Args>
238+
auto operator()(Args&&... args) const
239+
-> decltype(NodeStruct::operate(std::forward<Args>(args)...)) {
240+
return NodeStruct::operate(std::forward<Args>(args)...);
237241
}
238242
};
239243
struct MergeLazyFunction {
240-
Lazy operator()(Lazy const& a, Lazy const& b) const {
241-
return NodeStruct::merge_lazy(a, b);
244+
template <typename... Args>
245+
auto operator()(Args&&... args) const
246+
-> decltype(NodeStruct::merge_lazy(std::forward<Args>(args)...)) {
247+
return NodeStruct::merge_lazy(std::forward<Args>(args)...);
242248
}
243249
};
244250
lazy_segment_tree_from_node() = delete;

library/mrpython/typical_segment_tree.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ template <typename T, typename MergeFunction> class typical_segment_tree {
3535
size_t d = 2 * n - 1 - i;
3636
size_t l = d * 2, r = d * 2 + 1;
3737
data.emplace_back(doMerge(data[2 * n - 1 - l], size[2 * n - 1 - l],
38-
data[2 * n - 1 - r], size[2 * n - 1 - r]));
38+
data[2 * n - 1 - r], size[2 * n - 1 - r]));
3939
size.emplace_back(size[2 * n - 1 - l] + size[2 * n - 1 - r]);
4040
}
4141
std::reverse(data.begin(), data.end());
@@ -52,15 +52,15 @@ template <typename T, typename MergeFunction> class typical_segment_tree {
5252
set_impl(c, operate, pos * 2 + 1);
5353
else
5454
set_impl(c - m, operate, pos * 2 + 2);
55-
data[pos] = doMerge(data[pos * 2 + 1], size[pos * 2 + 1],
56-
data[pos * 2 + 2], size[pos * 2 + 2]);
55+
data[pos] = doMerge(data[pos * 2 + 1], size[pos * 2 + 1], data[pos * 2 + 2],
56+
size[pos * 2 + 2]);
5757
}
5858
std::pair<T, size_t> get_impl(size_t l, size_t r, size_t pos) {
5959
if (l == 0 && r == size[pos]) return {data[pos], size[pos]};
6060
size_t m = size[pos * 2 + 1];
6161
if (l < m && r > m)
6262
return doMerge(get_impl(l, m, pos * 2 + 1),
63-
get_impl(0, r - m, pos * 2 + 2));
63+
get_impl(0, r - m, pos * 2 + 2));
6464
else if (l < m)
6565
return get_impl(l, r, pos * 2 + 1);
6666
else if (r > m)
@@ -170,8 +170,10 @@ using typical_segment_tree_min = typical_segment_tree<T, min>;
170170
template <typename NodeStruct> class typical_segment_tree_from_node {
171171
using T = typename NodeStruct::T;
172172
struct MergeFunction {
173-
T operator()(T const& a, T const& b) const {
174-
return NodeStruct::merge_data(a, b);
173+
template <typename... Args>
174+
auto operator()(Args&&... args) const
175+
-> decltype(NodeStruct::merge_data(std::forward<Args>(args)...)) {
176+
return NodeStruct::merge_data(std::forward<Args>(args)...);
175177
}
176178
};
177179
typical_segment_tree_from_node() = delete;

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "mp-oi-library",
33
"displayName": "mp-oi-library",
44
"description": "Some algorithms and data structures template for competitive programming.",
5-
"version": "0.5.0",
5+
"version": "0.5.1",
66
"repository": "https://github.com/Mr-Python-in-China/mp-oi-library",
77
"license": "LGPL-3.0-only",
88
"author": {
@@ -69,5 +69,5 @@
6969
"bracketSpacing": true,
7070
"arrowParens": "avoid"
7171
},
72-
"packageManager": "yarn@4.9.1"
72+
"packageManager": "yarn@4.10.3"
7373
}

0 commit comments

Comments
 (0)