ST表
主要用来解决RMQ(区间最大/最小值查询)问题,主要应用倍增思想,可以实现O(n log n)预处理,O(1)查询。


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

代码:
cpp
//P3865 【模板】ST 表 & RMQ 问题
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ull unsigned long long
#define i128 __int128_t
#define INF -1e18
#define ls(x) x<<1
#define rs(x) x<<1|1
#define pii pair<int,int>
#define lowbit(x) ((x)&-(x))
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define fi first
#define se second
#define endl '\n'
typedef long long ll;
const int N=1e5+5;
const int M=1000000;
const int MOD=1e9+7;
const int maxk=22;
const int LOG=log2(N)+1;
int f[N][LOG];
int n,m;
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>f[i][0];
for(int i=1;i<=LOG;i++){ //枚举区间长度的指数
for(int j=1;j+(1LL<<i)-1<=n;j++){ //枚举起点
f[j][i]=max(f[j][i-1],f[j+(1LL<<(i-1))][i-1]);
}
}
int l,r;
while(m--){
cin>>l>>r;
int k=log2(r-l+1); //区间长度的指数
cout<<max(f[l][k],f[r-(1LL<<k)+1][k])<<endl;
}
}
signed main(){
IOS;
int T=1;
//cin>>T;
while(T--){
solve();
}
return 0;
}