ST表构建时间复杂度O(nlogn),查询时间复杂度O(1)
用于查询分段区间最值
dp构造ST表
for(int j=1;j<=k;j++)
for(int i=1;i<=m-(1<<j)+1;i++)
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
查询l-r区间最值:cout<<max(dp[l][k],dp[r-(1<<k)+1][k])<<endl;
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int a[1100];
int dp[1100][10];
int main()
{
int n;cin>>n;
for(int t=1;t<=n;t++)
{
memset(dp,0,sizeof(dp));
int m;cin>>m;
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
dp[i][0]=a[i];
}
int k=log2(m);
for(int j=1;j<=k;j++)
for(int i=1;i<=m-(1<<j)+1;i++)
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
int p;cin>>p;
for(int i=1;i<=p;i++)
{
int l,r;
cin>>l>>r;
int k=log2(r-l+1);
cout<<max(dp[l][k],dp[r-(1<<k)+1][k])<<endl;
}
}
return 0;
}