1
1
#ifndef CP_ALGO_STRUCTURES_SEGMENT_TREE_HPP
2
2
#define CP_ALGO_STRUCTURES_SEGMENT_TREE_HPP
3
3
#include < vector>
4
+ #include < numeric>
4
5
namespace cp_algo ::structures {
5
6
template <typename meta>
6
7
struct segtree_t {
7
- const int N;
8
+ const size_t N;
8
9
std::vector<meta> _meta;
9
10
10
- segtree_t (int n): N(n), _meta(4 * N) {}
11
+ segtree_t (size_t n): N(n), _meta(4 * N) {}
11
12
12
13
segtree_t (std::vector<meta> leafs): N(size(leafs)), _meta(4 * N) {
13
14
build (leafs);
14
15
}
15
16
16
- void pull (int v, int l, int r) {
17
+ void pull (size_t v, size_t l, size_t r) {
17
18
if (r - l > 1 ) {
18
19
_meta[v].pull (_meta[2 * v], _meta[2 * v + 1 ], l, r);
19
20
}
20
21
}
21
22
22
- void push (int v, int l, int r) {
23
+ void push (size_t v, size_t l, size_t r) {
23
24
if (r - l > 1 ) {
24
25
_meta[v].push (&_meta[2 * v], &_meta[2 * v + 1 ], l, r);
25
26
} else {
26
27
_meta[v].push (nullptr , nullptr , l, r);
27
28
}
28
29
}
29
30
30
- void build (auto &a, int v, size_t l, size_t r) {
31
+ void build (auto &a, size_t v, size_t l, size_t r) {
31
32
if (r - l == 1 ) {
32
33
if (l < size (a)) {
33
34
_meta[v] = a[l];
34
35
}
35
36
} else {
36
- size_t m = (l + r) / 2 ;
37
+ size_t m = std::midpoint (l, r) ;
37
38
build (a, 2 * v, l, m);
38
39
build (a, 2 * v + 1 , m, r);
39
40
pull (v, l, r);
@@ -44,15 +45,15 @@ namespace cp_algo::structures {
44
45
build (a, 1 , 0 , N);
45
46
}
46
47
47
- void exec_on_segment (int a, int b, auto func, auto proceed, auto stop, int v, int l, int r) {
48
+ void exec_on_segment (size_t a, size_t b, auto func, auto proceed, auto stop, size_t v, size_t l, size_t r) {
48
49
push (v, l, r);
49
50
if (r <= a || b <= l || stop (_meta[v])) {
50
51
return ;
51
52
} else if (a <= l && r <= b && proceed (_meta[v])) {
52
53
func (_meta[v]);
53
54
push (v, l, r);
54
55
} else {
55
- int m = (l + r) / 2 ;
56
+ size_t m = std::midpoint (l, r) ;
56
57
exec_on_segment (a, b, func, proceed, stop, 2 * v, l, m);
57
58
exec_on_segment (a, b, func, proceed, stop, 2 * v + 1 , m, r);
58
59
pull (v, l, r);
@@ -62,11 +63,11 @@ namespace cp_algo::structures {
62
63
static constexpr auto default_true = [](auto const &){return true ;};
63
64
static constexpr auto default_false = [](auto const &){return false ;};
64
65
65
- void exec_on_segment (int a, int b, auto func, auto proceed, auto stop) {
66
+ void exec_on_segment (size_t a, size_t b, auto func, auto proceed, auto stop) {
66
67
exec_on_segment (a, b, func, proceed, stop, 1 , 0 , N);
67
68
}
68
69
69
- void exec_on_segment (int a, int b, auto func) {
70
+ void exec_on_segment (size_t a, size_t b, auto func) {
70
71
exec_on_segment (a, b, func, default_true, default_false);
71
72
}
72
73
};
0 commit comments