11#ifndef CP_ALGO_STRUCTURES_SEGMENT_TREE_HPP
22#define CP_ALGO_STRUCTURES_SEGMENT_TREE_HPP
33#include < vector>
4+ #include < numeric>
45namespace cp_algo ::structures {
56 template <typename meta>
67 struct segtree_t {
7- const int N;
8+ const size_t N;
89 std::vector<meta> _meta;
910
10- segtree_t (int n): N(n), _meta(4 * N) {}
11+ segtree_t (size_t n): N(n), _meta(4 * N) {}
1112
1213 segtree_t (std::vector<meta> leafs): N(size(leafs)), _meta(4 * N) {
1314 build (leafs);
1415 }
1516
16- void pull (int v, int l, int r) {
17+ void pull (size_t v, size_t l, size_t r) {
1718 if (r - l > 1 ) {
1819 _meta[v].pull (_meta[2 * v], _meta[2 * v + 1 ], l, r);
1920 }
2021 }
2122
22- void push (int v, int l, int r) {
23+ void push (size_t v, size_t l, size_t r) {
2324 if (r - l > 1 ) {
2425 _meta[v].push (&_meta[2 * v], &_meta[2 * v + 1 ], l, r);
2526 } else {
2627 _meta[v].push (nullptr , nullptr , l, r);
2728 }
2829 }
2930
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) {
3132 if (r - l == 1 ) {
3233 if (l < size (a)) {
3334 _meta[v] = a[l];
3435 }
3536 } else {
36- size_t m = (l + r) / 2 ;
37+ size_t m = std::midpoint (l, r) ;
3738 build (a, 2 * v, l, m);
3839 build (a, 2 * v + 1 , m, r);
3940 pull (v, l, r);
@@ -44,15 +45,15 @@ namespace cp_algo::structures {
4445 build (a, 1 , 0 , N);
4546 }
4647
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) {
4849 push (v, l, r);
4950 if (r <= a || b <= l || stop (_meta[v])) {
5051 return ;
5152 } else if (a <= l && r <= b && proceed (_meta[v])) {
5253 func (_meta[v]);
5354 push (v, l, r);
5455 } else {
55- int m = (l + r) / 2 ;
56+ size_t m = std::midpoint (l, r) ;
5657 exec_on_segment (a, b, func, proceed, stop, 2 * v, l, m);
5758 exec_on_segment (a, b, func, proceed, stop, 2 * v + 1 , m, r);
5859 pull (v, l, r);
@@ -62,11 +63,11 @@ namespace cp_algo::structures {
6263 static constexpr auto default_true = [](auto const &){return true ;};
6364 static constexpr auto default_false = [](auto const &){return false ;};
6465
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) {
6667 exec_on_segment (a, b, func, proceed, stop, 1 , 0 , N);
6768 }
6869
69- void exec_on_segment (int a, int b, auto func) {
70+ void exec_on_segment (size_t a, size_t b, auto func) {
7071 exec_on_segment (a, b, func, default_true, default_false);
7172 }
7273 };
0 commit comments