链接
题目描述
给出一串数字,给M个询问,每次询问给出x,y,请你说出x到y这段区间的最大数
样例输入
10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8
样例输出
5
8
思路
这种多次要求区间内最大值的就是RMQ问题
因为数据很大,并且并不需要修改区间,所以考虑ST表
这道题是
那就没事了,直接上模板
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n, m, a[100005], f[100005][20], Log[100005];
int read() {
int re = 0;
char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') {
re = re * 10 + c - 48;
c = getchar();
}
return re;
}
int main() {
Log[0] = -1;
n = read();
m = read();
for (int i = 1; i <= n; ++i) {
a[i] = read();
f[i][0] = a[i];
Log[i] = Log[i >> 1] + 1;
}
for (int j = 1; j <= Log[n]; ++j)
for (int i = 1; i + (1 << j) - 1 <= n; ++i) f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
while (m--) {
int x, y;
x = read();
y = read();
int k = Log[y - x + 1];
printf("%d\n", max(f[x][k], f[y - (1 << k) + 1][k]));
}
return 0;
}