st表的作用是可以快速的得到区间内的一个最大值,不过它是静态的,即一旦初始化不能修改。
https://www.luogu.com.cn/problem/P3865
#include<bits/stdc++.h>
using namespace std;
const int N=200010,M=21;
int n,m;
int w[N];
int f[N][M];
void init()//初始化
{
for(int j=0;j<M;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
if(!j) f[i][j]=w[i];
else f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
int query(int l,int r)//查询
{
int len=r-l+1;
int k=log(len)/log(2);
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(void)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
init();
while(m--)
{
int l,r; scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
}