ST表


#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 100005;
int f[maxn][20], logn[maxn], n, m, a[maxn];
void pre() {
logn[1] = 0;
logn[2] = 1;
for (int i = 3; i <= n; i++) {
logn[i] = logn[i / 2] + 1;
}
}
void init() {
memset(f, -1, sizeof(f));
pre();
for (int i = 1; i <= n; i++) f[i][0] = a[i];
for (int i = 1; i <= logn[n]; i++) {
for (int j = 1; j + (1 << i) - 1 <= n; j++) {
f[j][i] = max(f[j][i - 1], f[j + (1 << (i - 1))][i - 1]);
}
}
}
int query(int x, int y) {
int s = logn[y - x + 1];
return max(f[x][s], f[y - (1 << s) + 1][s]);
}
int main() {
// freopen("test.in", "r", stdin);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
init();
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y));
}
return 0;
}

浙公网安备 33010602011771号