This repository has been archived by the owner on Feb 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLazy_Propagation_Segment_Tree.cpp
68 lines (68 loc) · 2.27 KB
/
Lazy_Propagation_Segment_Tree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <vector>
class SegmentTree {
private:
std::vector<int> tree, lazy;
int size;
void propagate(int node, int left, int right) {
if (lazy[node] != 0) {
tree[node] += lazy[node] * (right - left + 1);
if (left != right) {
lazy[2 * node + 1] += lazy[node];
lazy[2 * node + 2] += lazy[node];
}
lazy[node] = 0;
}
}
int query(int node, int left, int right, int queryLeft, int queryRight) {
propagate(node, left, right);
if (queryRight < left || queryLeft > right) {
return 0;
}
if (queryLeft <= left && queryRight >= right) {
return tree[node];
}
int mid = (left + right) / 2;
int leftSum = query(2 * node + 1, left, mid, queryLeft, queryRight);
int rightSum = query(2 * node + 2, mid + 1, right, queryLeft, queryRight);
return leftSum + rightSum;
}
void update(int node, int left, int right, int updateLeft, int updateRight, int value) {
propagate(node, left, right);
if (updateRight < left || updateLeft > right) {
return;
}
if (updateLeft <= left && updateRight >= right) {
tree[node] += value * (right - left + 1);
if (left != right) {
lazy[2 * node + 1] += value;
lazy[2 * node + 2] += value;
}
return;
}
int mid = (left + right) / 2;
update(2 * node + 1, left, mid, updateLeft, updateRight, value);
update(2 * node + 2, mid + 1, right, updateLeft, updateRight, value);
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
public:
SegmentTree(int n) {
size = n;
tree.resize(4 * n, 0);
lazy.resize(4 * n, 0);
}
int query(int queryLeft, int queryRight) {
return query(0, 0, size - 1, queryLeft, queryRight);
}
void update(int updateLeft, int updateRight, int value) {
update(0, 0, size - 1, updateLeft, updateRight, value);
}
};
int main() {
int n = 8;
SegmentTree segmentTree(n);
segmentTree.update(1, 5, 3);
segmentTree.update(3, 7, 2);
std::cout << "Query result: " << segmentTree.query(2, 6) << std::endl;
return 0;
}