P3865 【模板】ST表
输入输出样例
输入
8 8
9 3 1 7 5 6 0 8
1 6
1 5
2 7
2 6
1 8
4 8
3 7
1 8
输出
9
9
7
7
9
8
7
9
ST(Sparse Table)表是解决RMQ(Range Minimum/Maximum Query,区间最值)问题的算法。
算法首先对数据预处理,每个2^k区间的最值是其下两个 2 ^(k-1)区间的最值,最后查询时取两个小区间内的最值。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=100005;
int T,n,m,ans;
int dp[N][25];
int main()
{
int i,j,k,x,y;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&dp[i][0]);
}
for(j=1;j<=21;j++){
for(i=1;i+(1<<j)-1<=n;i++){
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
while(m--){
scanf("%d %d",&x,&y);
k=log2(y-x+1);
//k=0;while(1<<(k+1)<=y-x+1) k++;
printf("%d\n",max(dp[x][k],dp[y-(1<<k)+1][k]));//取交集 2^(k-1) <= x-y+1 <= 2^k
}
return 0;
}