st表——RMQ 问题

st表——RMQ 问题

(洛谷)P3865 【模板】ST 表 & RMQ 问题

(一本通)1541:【例 1】数列区间最大值

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
#define endl '\n'
#define int long long 
int num[100001];
int maxn[100001][21];
int n,m;
int lg[100010];
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;//log(10,x)预处理
    
	for(int i=1;i<=n;i++){//输入 
		scanf("%lld",&num[i]);
		maxn[i][0]=num[i];
	}
	for(int i=1;1<<i<=n;i++){//st处理 
		int logg=1<<i;
		for(int j=1;j+logg-1<=n;j++){
			maxn[j][i]=max(maxn[j][i-1],maxn[j+logg/2][i-1]);
		}
	}
	for(int i=1;i<=m;i++){//查询 
		int l,r;
		scanf("%lld%lld",&l,&r);
		if(l==r){
			printf("%lld\n",num[l]);
			continue;
		}
		else{
			int len=r-l+1;
			int logg=lg[len];
			int loggnum=1<<logg;
			int maxnum=max(maxn[l][logg],maxn[r-loggnum+1][logg]);
			printf("%lld\n",maxnum);
		}
	}
	return 0;
}
posted @ 2025-11-26 13:52  10mbps_十兆網路  阅读(17)  评论(0)    收藏  举报