【题目描述】
输入一串数字,给你 M 个询问,每次询问就给你两个数字 X,Y,要求你说出 X 到 Y 这段区间内的最大数。
【输入】
第一行两个整数 N,M 表示数字的个数和要询问的次数;
接下来一行为 N 个数;
接下来 M 行,每行都有两个整数 X,Y。
【输出】
输出共 M 行,每行输出一个数。
【输入样例】
10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8
【输出样例】
5
8
【提示】
数据范围与提示:
对于全部数据,1≤N≤105,1≤M≤106,1≤X≤Y≤N。数字不超过 C/C++ 的 int 范围。
【来源】
无
自己补充
因为要问m次不同区间,每次去穷举太麻烦(low)了,所以我们又把它分成小部分
通过预处理(O(nlogn))把简化每次询问变成渣渣(O(1))
#include<cstdio>
using namespace std;
const int N=100001,LogN=20;
int n,m,i,j,x,y,a[N],log[N],f[N][LogN+5];//f[i][j]表示区间[i,i+2^j-1]中的最大值
int qread() {
char ch