AlgoPlus v0.1.0
Loading...
Searching...
No Matches
segment_tree.h
1#ifndef SEGMENT_TREE_H
2#define SEGMENT_TREE_H
3
4#ifdef __cplusplus
5#include <cmath>
6#include <iostream>
7#include <vector>
8#endif
9
15 public:
20 inline explicit segment_tree(const std::vector<int>& v) noexcept : data(v) {
21 int x = (int)(ceil(log2(v.size())));
22 int max_size = 2 * (int)(pow(2, x) - 1);
23 this->root = std::vector<int>(max_size);
24 _construct(0, v.size() - 1, 0);
25 }
26
32 inline void update(int idx, int key) {
33 if (idx < 0 || idx > data.size()) {
34 return;
35 }
36
37 int diff = key - data[idx];
38 data[idx] = key;
39 _update(0, data.size() - 1, idx, diff, 0);
40 }
41
48 inline int sum(int query_start, int query_end) {
49 if (query_start < 0 || query_end >= data.size() || query_start > query_end) {
50 return -1;
51 }
52
53 return _sum(0, data.size() - 1, query_start, query_end, 0);
54 }
55
56 private:
57 std::vector<int> root;
58 std::vector<int> data;
59
67 int _construct(int start, int end, int si = 0) {
68 if (start == end) {
69 root[si] = data[start];
70 return data[start];
71 }
72
73 int mid = start + (end - start) / 2;
74 root[si] = _construct(start, mid, si * 2 + 1) + _construct(mid + 1, end, si * 2 + 2);
75 return root[si];
76 }
77
85 void _update(int start, int end, int i, int diff, int si = 0) {
86 if (i < start || i > end) {
87 return;
88 }
89
90 root[si] = root[si] + diff;
91 if (end != start) {
92 int mid = start + (end - start) / 2;
93 _update(start, mid, i, diff, si * 2 + 1);
94 _update(mid + 1, end, i, diff, si * 2 + 2);
95 }
96 }
97
107 int _sum(int start, int end, int query_start, int query_end, int si = 0) {
108 if (query_start <= start && query_end >= end) {
109 return root[si];
110 }
111 if (end < query_start || start > query_end) {
112 return 0;
113 }
114 int mid = start + (end - start) / 2;
115 return _sum(start, mid, query_start, query_end, si * 2 + 1) +
116 _sum(mid + 1, end, query_start, query_end, si * 2 + 2);
117 }
118};
119
120#endif
void update(int idx, int key)
Definition segment_tree.h:32
int sum(int query_start, int query_end)
sum function
Definition segment_tree.h:48
segment_tree(const std::vector< int > &v) noexcept
default constructor for segment tree
Definition segment_tree.h:20