#include <iostream>
//线段树
using namespace std;
int arr[10] = { 0 };
int tree[50] = { 0 };
void build_tree(int node, int l, int r, int* arr) {
if (l == r) {
tree[node] = arr[l];
return;
}
int mid = (l + r) / 2;
build_tree(node * 2 + 1, l, mid, arr);
build_tree(node * 2 + 2, mid + 1, r, arr);
tree[node] = tree[node * 2 + 1] + tree[node * 2 + 2];
return;
}
void update(int node, int l, int r, int ind, int val) {
if (l == r) {
tree[node] = val;
return;
}
int mid = (l + r) / 2;
if (ind <= mid) update(node * 2 + 1, l, mid, ind, val);
else update(node * 2 + 2, mid + 1, r, ind, val);
tree[node] = tree[node * 2 + 1] + tree[node * 2 + 2];
return;
}
int query(int node, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return tree[node];
}
int mid = (l + r) / 2;
int ret = 0;
if (L <= mid) ret += query(node * 2 + 1, l, mid, L, R);
if (R > mid) ret += query(node * 2 + 2, mid + 1, r, L, R);
return ret;
}
void output(int* arr, int n) {
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return;
}
int main() {
srand(time(0));
for (int i = 0; i < 10; i++) {
arr[i] = rand() % 30;
}
build_tree(0, 0, 9, arr);
cout << "arr[]:"; output(arr, 10);
cout << "tree[]:"; output(tree, 35);
for (int i = 0; i < 5; i++) {
cout << "请选择你要执行的操作";
cout << "1.修改 2.查询";
int a;
cin >> a;
if (a == 1) {
int ind, val;
cin >> ind >> val;
arr[ind] = val;
update(0, 0, 9, ind, val);
cout << "tree[]:";output(tree, 35);
}
else {
int L, R;
cin >> L >> R;
int ret = query(0, 0, 9, L, R);
cout << ret << endl;
}
}
return 0;
}
线段树【代码】
于 2023-11-14 19:59:28 首次发布