求区间最大值
题目描述
给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值。
输入描述
第一行包含两个整数 N,M,分别表示数列的长度和询问的个数。
第二行包含 N 个整数(记为𝑎𝑖),依次表示数列的第 i 项。接下来 M 行,每行包含两个整数
𝑙𝑖,𝑟𝑖,表示查询的区间为
[𝑙𝑖,𝑟𝑖]。
输出描述
输出包含 M 行,每行一个整数,依次表示每一次询问的结果。
提示
【数据范围】
1≤𝑁,𝑀≤105,0≤𝑎𝑖≤109
输入样例
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
输出样例
9
9
7
7
9
8
7
9
#include <iostream>
using namespace std;int f[100005][17];
int logn[100005];int main() {int n, m;cin >> n >> m;for (int i = 1; i <= n; i++)cin >> f[i][0];for (int j = 1; 1<<j <= 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]);logn[1] = 0;for (int i = 2; i <= n; i++)logn[i] = logn[i/2] + 1;int l, r;for (int i = 0; i < m; i++) {scanf("%d %d", &l, &r);int x = logn[r-l+1];int mmax = max(f[l][x], f[r-(1<<x)+1][x]);printf("%d\n", mmax);}return 0;
}