背景:给定n个数,有m个询问,对于每个询问,你需要回答区间[l, r]中的最大值
,
ST表基于倍增的思想,可用做到O(nlogn)预处理,O(1)回答每个询问,但是不支持修改操作
#include <bits/stdc++.h>
using namespace std;
int a[100005], st[100005][20], n, m;
void init() {
int k = __lg(n);
for(int i = 1; i <= n; i++) st[i][0] = a[i];
for(int i = 1; i <= k; i++) {
for(int j = 1; j + (1 << i) - 1 <= n; j++) {
st[j][i] = max(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]);
}
}
}
int query(int l, int r) {
int k = __lg(r - l + 1);
return max(st[l][k], st[r - (1 << k) + 1][k]);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
init();
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", query(l, r));
}
return 0;
}