//O(nlogn)预处理 O(1)查询
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int st[maxn][21];
int query(int l,int r){//区间最值查询
int k = log2(r-l+1);
return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main (){
int n,q;
cin>>n>>q;
for (int i=1;i<=n;++i) scanf("%d",&st[i][0]);
for (int j=1;(1<<j)<=n;++j) {
for (int i = 1; i + (1 << j) - 1<= n; ++i) {
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}
while (q--){
int l,r;
cin>>l>>r;
int ans = query(l,r);
printf("%d\n",ans);
}
return 0;
}
ST表模板
最新推荐文章于 2024-07-18 17:22:15 发布