-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasicSegmentTree.cpp
More file actions
63 lines (54 loc) · 2.15 KB
/
basicSegmentTree.cpp
File metadata and controls
63 lines (54 loc) · 2.15 KB
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
struct BasicSegmentTree {
struct BasicSegmentTreeValue {
int value;
BasicSegmentTreeValue() {
}
inline BasicSegmentTreeValue operator+ (const BasicSegmentTreeValue& other) const {
BasicSegmentTreeValue combinedValue;
combinedValue.value = value + other.value;
return combinedValue;
}
};
vector<BasicSegmentTreeValue> nodeData;
vector<BasicSegmentTreeValue> data;
void build(int node, int low, int high) {
if (static_cast<int>(nodeData.size()) <= node) {
nodeData.resize(static_cast<unsigned int>(node + 1));
}
if (low == high) {
nodeData[node] = data[low];
} else {
int middle = (low + high) / 2;
build(2 * node, low, middle);
build(2 * node + 1, middle + 1, high);
nodeData[node] = nodeData[2 * node] + nodeData[2 * node + 1];
}
}
void modifySingleElement(int node, int low, int high, int pos, BasicSegmentTreeValue newValue) {
if (low == high) {
nodeData[node] = newValue;
} else {
int middle = (low + high) / 2;
if (pos <= middle) {
modifySingleElement(2 * node, low, middle, pos, newValue);
} else {
modifySingleElement(2 * node + 1, middle + 1, high, pos, newValue);
}
nodeData[node] = nodeData[2 * node] + nodeData[2 * node + 1];
}
}
BasicSegmentTreeValue getRangeData(int node, int low, int high, int rangeLow, int rangeHigh) {
if (low == rangeLow && high == rangeHigh) {
return nodeData[node];
} else {
int middle = (low + high) / 2;
if (rangeHigh <= middle) {
return getRangeData(2 * node, low, middle, rangeLow, rangeHigh);
} else if (rangeLow > middle) {
return getRangeData(2 * node + 1, middle + 1, high, rangeLow, rangeHigh);
} else {
return getRangeData(2 * node, low, middle, rangeLow, middle) + getRangeData(2 * node + 1, middle + 1, high, middle + 1, rangeHigh);
}
}
}
};