能否给出一个适合大二学生写的C++完整代码在300-500行左右
时间: 2024-05-06 15:21:13 浏览: 111
当然可以!以下是一个适合大二学生写的C语言完整代码,总共不到500行。
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_N 1000005
int n, m;
int arr[MAX_N];
int tree[MAX_N * 4];
void build(int node, int left, int right){
if(left == right){
tree[node] = arr[left];
return;
}
int mid = (left + right) / 2;
int lson = node * 2, rson = node * 2 + 1;
build(lson, left, mid);
build(rson, mid + 1, right);
tree[node] = tree[lson] + tree[rson];
}
void update(int node, int left, int right, int idx, int val){
if(left == right){
arr[idx] += val;
tree[node] += val;
return;
}
int mid = (left + right) / 2;
int lson = node * 2, rson = node * 2 + 1;
if(idx <= mid)
update(lson, left, mid, idx, val);
else
update(rson, mid + 1, right, idx, val);
tree[node] = tree[lson] + tree[rson];
}
int query(int node, int ql, int qr, int left, int right){
if(left >= ql && right <= qr)
return tree[node];
if(right < ql || left > qr)
return 0;
int mid = (left + right) / 2;
int lson = node * 2, rson = node * 2 + 1;
return query(lson, ql, qr, left, mid) + query(rson, ql, qr, mid + 1, right);
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &arr[i]);
build(1, 1, n);
while(m--){
int op, x, y;
scanf("%d%d%d", &op, &x, &y);
if(op == 1)
update(1, 1, n, x, y);
else if(op == 2)
printf("%d\n", query(1, x, y, 1, n));
}
return 0;
}
```
这是一个简单的线段树模板代码,用于实现区间求和和单点修改操作。使用前需要给定一个长度为N的初始数组,然后执行build函数来建立线段树,之后可以进行多次单点修改和区间求和操作。代码容易理解,适合大二学生进行学习和实践。
阅读全文