Skip to content

Commit 6e7be37

Browse files
committed
trees - segment trees
1 parent cc34941 commit 6e7be37

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

competitive_prog/segment_trees.cpp

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include <iostream>
2+
#include <vector>
3+
4+
class SegmentTree {
5+
private:
6+
std::vector<int> tree;
7+
int n;
8+
9+
void build(const std::vector<int>& arr, int start, int end, int node) {
10+
if (start == end) {
11+
// Leaf node will have a single element
12+
tree[node] = arr[start];
13+
} else {
14+
int mid = (start + end) / 2;
15+
// Recursively build the segment tree
16+
build(arr, start, mid, 2 * node + 1);
17+
build(arr, mid + 1, end, 2 * node + 2);
18+
// Internal node will have the sum of both of its children
19+
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
20+
}
21+
}
22+
23+
void update(int start, int end, int idx, int value, int node) {
24+
if (start == end) {
25+
// Leaf node
26+
tree[node] = value;
27+
} else {
28+
int mid = (start + end) / 2;
29+
if (idx <= mid) {
30+
// If idx is in the left child, recurse on the left child
31+
update(start, mid, idx, value, 2 * node + 1);
32+
} else {
33+
// Otherwise, recurse on the right child
34+
update(mid + 1, end, idx, value, 2 * node + 2);
35+
}
36+
// Internal node will have the sum of both of its children
37+
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
38+
}
39+
}
40+
41+
int query(int start, int end, int l, int r, int node) const {
42+
if (r < start || l > end) {
43+
// Range represented by this node is completely outside the given range
44+
return 0;
45+
}
46+
if (l <= start && end <= r) {
47+
// Range represented by this node is completely inside the given range
48+
return tree[node];
49+
}
50+
// If a part of this segment overlaps with the query range
51+
int mid = (start + end) / 2;
52+
int leftSum = query(start, mid, l, r, 2 * node + 1);
53+
int rightSum = query(mid + 1, end, l, r, 2 * node + 2);
54+
return leftSum + rightSum;
55+
}
56+
57+
public:
58+
SegmentTree(const std::vector<int>& arr) {
59+
n = arr.size();
60+
tree.resize(4 * n);
61+
build(arr, 0, n - 1, 0);
62+
}
63+
64+
void update(int idx, int value) {
65+
update(0, n - 1, idx, value, 0);
66+
}
67+
68+
int query(int l, int r) const {
69+
return query(0, n - 1, l, r, 0);
70+
}
71+
};
72+
73+
int main() {
74+
std::vector<int> arr = {1, 3, 5, 7, 9, 11};
75+
SegmentTree segTree(arr);
76+
77+
// Query sum from index 1 to 3
78+
std::cout << "Sum of values in given range = " << segTree.query(1, 3) << std::endl;
79+
80+
// Update: set arr[1] = 10
81+
segTree.update(1, 10);
82+
83+
// Query sum from index 1 to 3 after update
84+
std::cout << "Sum of values in given range after update = " << segTree.query(1, 3) << std::endl;
85+
86+
return 0;
87+
}
88+

0 commit comments

Comments
 (0)