AlgoPlus v0.1.0
Loading...
Searching...
No Matches
segment_tree_iterative.h
1#ifndef SEGMENT_TREE_ITERATIVE_H
2#define SEGMENT_TREE_ITERATIVE_H
3
4#ifdef __cplusplus
5#include <cassert>
6#include <iostream>
7#include <vector>
8#endif
9
13template <typename T> struct seg_tree {
14 std::vector<T> tree;
15 std::vector<T> data;
16 int n;
17
22 inline explicit seg_tree(const std::vector<T>& v) noexcept : data(v), n(int(v.size())) {
23 tree = std::vector<T>(2 * v.size(), 0);
24 int idx = n - 1;
25 for (int i = 2 * n - 1; i >= n; i--) {
26 tree[i] = data[idx--];
27 }
28
29 idx = 0;
30 for (int i = n - 1; i >= 1; i--) {
31 tree[i] = tree[2 * n - idx - 1] + tree[2 * n - idx - 2];
32 idx += 2;
33 }
34 }
35
43 inline T sum(int a, int b) {
44 assert(a >= 0 && a <= b && b < n);
45 a += n;
46 b += n;
47 T s = 0;
48 while (a <= b) {
49 if (a % 2 == 1) {
50 s += tree[a++];
51 }
52 if (b % 2 == 0) {
53 s += tree[b--];
54 }
55 a /= 2;
56 b /= 2;
57 }
58
59 return s;
60 }
61
67 inline void update(int idx, T x) {
68 assert(idx >= 0 && idx < n);
69 idx += n;
70 tree[idx] = x;
71 for (idx /= 2; idx >= 1; idx /= 2) {
72 tree[idx] = tree[2 * idx] + tree[2 * idx + 1];
73 }
74 }
75};
76
77#endif
seg_tree(const std::vector< T > &v) noexcept
default constructor
Definition segment_tree_iterative.h:22
void update(int idx, T x)
update query
Definition segment_tree_iterative.h:67
T sum(int a, int b)
sum query
Definition segment_tree_iterative.h:43