/*
【RMQ】【AcWing】【1270.数列区间最大值】
RMQ:区间最值查询 预处理O(nlogn) 查询O(1) 不能进行区间修改
题意:给出n个大小的数组 m次查询 区间:【X,Y】的最值
*/
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
const int cc=log2(maxn)+1;
int nums[maxn];
int dp[maxn][cc];
int main()
{
int N,M;cin>>N>>M;
for(int i=1;i<=N;i++)
scanf("%d",&nums[i]);
//初始化 及 预处理nums 数组
for(int i=1;i<=N;i++)
dp[i][0]=nums[i];
/*
解释:dp过程
dp[i][j]代表i~i+2^j-1 这个区间最值
j表示 2^j 区间大小
计算区间1 2 4 8 16...log(n)
重点在于for(i)的终止条件 判断i区间的最后一个值是否存在
以及 dp后一半的判断 位于i区间后一半的第一个值 表示后一半区间的最值
*/
for(int j=1;(1<<j)<=N;j++)//判断 这个最大区间是否存在
for(int i=1;(i+(1<<j)-1)<=N;i++)//判断 这个区间是否存在
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);//不懂优先级? 那么就加() << >>的优先级是5 + - * / 的优先级是4
int x,y;
while(M--)
{
scanf("%d%d",&x,&y);
int k=log2(y-x+1);
cout<<max(dp[x][k],dp[y-(1<<k)+1][k])<<'\n';
}
return 0;
}
【ST表(RMQ)】【AcWing】【1270.数列区间最大值】
于 2022-04-11 09:38:43 首次发布