#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[100004];
struct data{int l,r,val;}tr[2*100004];
void build(int k,int s,int t) {//建树
tr[k].l=s;tr[k].r=t;
if(s==t) {tr[k].val=a[s];return;}
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
tr[k].val=max(tr[k<<1].val,tr[k<<1|1].val);
}
int ask2(int k,int x,int y){//区间最大值
int ll=tr[k].l,rr=tr[k].r;
if(x==ll && y==rr) return tr[k].val;
int mid=(ll+rr)>>1;
if(y<=mid) return ask2(k<<1,x,y);
else if(x>mid) return ask2(k<<1|1,x,y);
else return max(ask2(k<<1,x,mid),ask2(k<<1|1,mid+1,y));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",ask2(1,x,y));
}
return 0;
}
样例输入:
8 4
5 12 7 11 3 9 28 4
1 3
2 4
6 6
2 8
样例输出:
12
12
9
28