对于ST表st数组
s
t
[
i
]
[
j
]
st[ i ][ j ]
st[i][j]中,
i
i
i表示从第几位数开始
j
j
j表示从
i
i
i开始的第
2
j
2^j
2j个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()///快读
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int n=read();
int m=read();
int a[100005];
int st[100005][30];///st表
void getst()///预处理区间最值
{
for(int i=1;i<=n;i++)///
{
st[i][0]=a[i];
}
for(int j=1;j<=log2(n);j++)
{
for(int i=1;i<=n-(1<<j)+1;i++)
{
st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
int main()
{
for(int i=1;i<=n;i++)
a[i]=read();
getst();
for(int i=1;i<=m;i++)
{
int l=read();
int r=read();
int p=log2(r-l+1);
printf("%d\n",max(st[l][p],st[r-(1<<p)+1][p]));///区间可覆盖
}
return 0;
}