Understanding Segment Trees
#include <bits/stdc++.h>
using namespace std;
class SegmentTree {
private:
vector<int> tree;
int n;
void build(const vector<int> &arr, int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
} else {
int mid = (start + end) / 2;
build(arr, 2 * node, start, mid);
build(arr, 2 * node + 1, mid + 1, end);
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
}
int query(int node, int start, int end, int left, int right) {
if (right < start || end < left) {
return 0;
}
if (left <= start && end <= right) {
return tree[node];
}
int mid = (start + end) / 2;
return query(2 * node, start, mid, left, right) +
query(2 * node + 1, mid + 1, end, left, right);
}
void update(int node, int start, int end, int idx, int val) {
if (start == end) {
tree[node] = val;
} else {
int mid = (start + end) / 2;
if (idx <= mid) {
update(2 * node, start, mid, idx, val);
} else {
update(2 * node + 1, mid + 1, end, idx, val);
}
tree[node] = tree[2 * node] + tree[2 * node + 1];
}
}
public:
SegmentTree(const vector<int> &arr) {
n = arr.size();
tree.resize(4 * n);
build(arr, 1, 0, n - 1);
}
int query(int left, int right) {
return query(1, 0, n - 1, left, right);
}
void update(int idx, int val) {
update(1, 0, n - 1, idx, val);
}
};
void solve() {
vector<int> arr = {1, 3, 5, 7, 9, 11};
SegmentTree st(arr);
cout << "Sum in range [1, 3]: " << st.query(1, 3) << "\n";
cout << "Sum in range [2, 5]: " << st.query(2, 5) << "\n";
st.update(2, 10);
cout << "After updating index 2 to 10, sum in range [1, 3]: " << st.query(1, 3) << "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}
Summary
Operation | Time Complexity |
---|---|
Build Tree | O(n) |
Query | O(log n) |
Update | O(log n) |
Providing code but not explaining how Segment Trees work does not build understanding
Please change the title to something like "My Segment Tree Template"
I don't get it why a person who have 5 week experience is learning about segment tree ???