st表

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(){
    //st graph
    int n,m;
    cin>>n>>m;
    int len=(log2(n));
    vector<vector<ll>>dp(n+1,vector<ll>(len+1));
    for(int i=1;i<=n;i++) cin>>dp[i][0];//2的0次方长度为1
    //dp[i][j] i起点 j次幂长度
    //先枚举长度 再枚举起点
    for(int j=1;j<=len;j++){
		for(int 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--){
		int a,b;
		cin>>a>>b;
		int k=log2(b-a+1);//区间长度向下取log
		int ans=max(dp[a][k],dp[b-(1<<k)+1][k]);
		cout<<ans<<endl;
	}
	return 0;
}
posted @ 2025-04-19 20:31  Qacter  阅读(6)  评论(0)    收藏  举报