#include<bits/stdc++.h>
using namespace std;
#define MAXN 50010
int n,q,h[MAXN],log_2[MAXN],rmax[MAXN][18],rmin[MAXN][18];
void init()//ST表的建立
{
for(int i = 1;i <= n;i++)
rmax[i][0] = rmin[i][0] = h[i];//第一列初始化
for(int j = 1;(1<<j) <= n;j++)//j不大于log2(n)
{
for(int i = 1;i <= n-(1<<j) + 1;i++)//每往后一列,行数减少,减少量为1<<j
{
rmax[i][j] = max(rmax[i][j - 1],rmax[i + 1<<(j-1)][j-1]);//后一列最大值的赋值
rmin[i][j] = min(rmin[i][j - 1],rmin[i + 1<<(j-1)][j-1]);//后一列最小值的赋值
}
}
}
//区间最大值
int query_max(int A,int B)
{
int x = log_2[B - A + 1];
return max(rmax[A][x],rmax[B-(1<<x) + 1][x]);
}
//区间最小值
int query_min(int A,int B)
{
int x = log_2[B - A + 1];
return min(rmin[A][x],rmin[B-(1<<x) + 1][x]);
}
int main(){
cin>>n>>q;
for(int i = 1;i <= n;i++)
cin>>h[i];//输入数值的值
for(int i = 2;i <= n;i++)
{
log_2[i] = log_2[i>>1] + 1;
}
init();
while(q--)
{
int A,B;
cin>>A>>B;
cout<<"max="<<query_max(A,B)<<endl;
cout<<"min="<<query_min(A,B);
}
return 0;
}
倍增与ST表
最新推荐文章于 2024-09-13 16:27:15 发布