- #include<bits/stdc++.h>
- using namespace std;
- const int N=1e5;
- int a[N],n,f[N][30],Log2[N];
- //f[i][p]表示从第i个点开始的2^p个数的最值
- //即区间 [i,i+2^p-1] 的最值
- void init() {//nlogn预处理
- for(int i=1; i<=n; i++)f[i][0]=a[i];//f[i][0]为本身
- for(int p=1; (1<<p)<=n; p++) {//防出界
- for(int i=1; i+(1<<p)-1<=n; i++) {//第i个点控制的区间到1+(1<<p)-1,防出界
- f[i][p]=max(f[i][p-1],f[i+(1<<(p-1))][p-1]);
- //f[i][p]的最值由前半段f[i][p-1]和后半段f[i+pow(2,p-1)][p-1]得来
- }
- }
- int t=0;//log2打表
- for(int i=0;i<=n;i++){
- while((1<<(t+1))<=i)t++;
- Log2[i]=t;
- }
- }
- int query(int l,int r){
- int k=Log2[r-l+1];
- return max(f[l][k],f[r-(1<<k)+1][k]);
- }
- int main(){
- int m,l,r;
- cin>>n>>m;
- for(int i=1;i<=n;i++)scanf("%d",&a[i]);
- init();
- for(int i=1;i<=m;i++){
- scanf("%d%d",&l,&r);
- printf("%d",query(l,r));
- }
- return 0;
- }
|