Skip to content

Commit d83a3ab

Browse files
authored
basic segment tree
1 parent 66ba55f commit d83a3ab

File tree

1 file changed

+21
-31
lines changed

1 file changed

+21
-31
lines changed

segment_tree.cpp

+21-31
Original file line numberDiff line numberDiff line change
@@ -35,46 +35,36 @@ void print(int a[], int b, int e) {
3535
}
3636

3737
void init(int node, int b, int e) {
38-
if (b == e) {
39-
tree[node] = arr[b];
40-
return;
41-
}
42-
int left = node << 1;
43-
int right = (node << 1) + 1;
44-
int mid = (b + e) >> 1;
45-
init(left, b, mid);
46-
init(right, mid + 1, e);
47-
tree[node] = tree[left] + tree[right];
38+
if (b == e) tree[node] = arr[b];
39+
else {
40+
int left = node << 1, right = left | 1, mid = (b+e) >> 1;
41+
init(left, b, mid);
42+
init(right, mid+1, e);
43+
tree[node] = tree[left] + tree[right];
44+
}
4845
}
4946

5047
int query(int node, int b, int e, int i, int j) {
51-
if (i > e || j < b) return 0;
52-
if (b >= i && e <= j) return tree[node];
53-
int left = node << 1;
54-
int right = (node << 1) + 1;
55-
int mid = (b + e) >> 1;
56-
int ls = query(left, b, mid, i, j);
57-
int rs = query(right, mid + 1, e, i, j);
58-
return ls + rs;
59-
}
48+
if (b > j || e < i) return 0;
49+
if (b >= i && e <= j) return tree[node];
50+
int left = node << 1, right = left | 1, mid = (b+e) >> 1;
51+
return query(left, b, mid, i, j) + query(right, mid+1, e, i, j);
52+
}
6053

6154
void update(int node, int b, int e, int i, int val) {
62-
if (i > e || i < b) return;
63-
if (b >= i && e <= i) {
64-
tree[node] = val;
65-
return;
66-
}
67-
int left = node << 1;
68-
int right = (node << 1) + 1;
69-
int mid = (b + e) >> 1;
70-
update(left, b, mid, i, val);
71-
update(right, mid + 1, e, i, val);
72-
tree[node] = tree[left] + tree[right];
55+
if (b > i || e < i) return;
56+
if (b >= i && e <= i) {
57+
tree[node] = val;
58+
return;
59+
}
60+
int left = node << 1, right = left | 1, mid = (b+e) >> 1;
61+
update(left, b, mid, i, val);
62+
update(right, mid+1, e, i, val);
63+
tree[node] = tree[left] + tree[right];
7364
}
7465

7566
int main() {
7667
// freopen("in", "r", stdin);
77-
7868
int n, q, i, j, ans;
7969
scanf("%d %d", &n, &q);
8070
for (int k = 1; k <= n; scanf("%d", &arr[k]), k++);

0 commit comments

Comments
 (0)