请用C++代码实现一个线段树用于查询区间最大值
时间: 2023-05-24 20:05:26 浏览: 119
时间分析-C++线段树讲解PPT
```C
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_N 100000
int max(int a, int b) {
return a > b ? a : b;
}
typedef struct {
int l, r; // 左右端点
int maxn; // 最大值
} Node;
Node tree[MAX_N * 4]; // 线段树
// 建树
void build(int l, int r, int i) {
tree[i].l = l;
tree[i].r = r;
if (l == r) {
scanf("%d", &tree[i].maxn);
return;
}
int mid = (l + r) / 2;
build(l, mid, i * 2);
build(mid + 1, r, i * 2 + 1);
tree[i].maxn = max(tree[i * 2].maxn, tree[i * 2 + 1].maxn);
}
// 查询区间最大值
int query(int l, int r, int i) {
if (tree[i].l >= l && tree[i].r <= r) {
return tree[i].maxn;
}
int mid = (tree[i].l + tree[i].r) / 2;
int maximum = INT_MIN;
if (l <= mid) {
maximum = max(maximum, query(l, r, i * 2));
}
if (r > mid) {
maximum = max(maximum, query(l, r, i * 2 + 1));
}
return maximum;
}
int main() {
int n, q, l, r;
scanf("%d%d", &n, &q);
build(1, n, 1); // 建树
while (q--) {
scanf("%d%d", &l, &r);
printf("%d\n", query(l, r, 1)); // 查询区间最大值
}
return 0;
}
```
阅读全文