题目描述:
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100010;
int a[maxn],c[maxn];
int N,M;
int lowbit(int x){return x&(-x);}
void update(int p,int v){
c[p]=v;
int lx=lowbit(p);
for(int i=1;i<lx;i<<=1){
c[p]=max(c[p],c[p-i]);
}
}
int getmax(int l, int r){
if(l==r) return a[r];
if(r-lowbit(r)+1==l) return c[r];
if(r-lowbit(r)+1>l) return max(c[r],getmax(l,r-lowbit(r)));
else{
return max(a[r],getmax(l,r-1));
}
}
int main(){
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++){
scanf("%d",&a[i]);
update(i,a[i]);
}
int X,Y;
for(int i=1;i<=M;i++){
scanf("%d%d",&X,&Y);
printf("%d\n",getmax(X,Y));
}
return 0;
}