#include <iostream>
#include <cstring>
using namespace std;
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+(ch^48),ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
const int N=1e5+5,Log=25;
int n,m,l,r,x;
int a[N];
class ST{
public:
ST(int (*_op)(int x,int y)=[](int x,int y)->int{return max(x,y);},
int _initval=0)
: op(_op),initval(_initval){}
void init(int *a,int n){
memset(f,initval,sizeof(f));
lg[0]=-1;
for(int i=1; i<=n; i++) f[i][0]=a[i],lg[i]=lg[i>>1]+1;
for(int j=1; j<Log; j++)
for(int i=1; i+(1<<j)-1<=n; i++)
f[i][j]=op(f[i][j-1],f[i+(1<<j-1)][j-1]);
}
inline int query(int l,int r){
x=lg[r-l+1];
return max(f[l][x],f[r-(1<<x)+1][x]);
}
private:
int initval,x;
int (*op)(int x,int y);
int lg[Log],f[N][Log];
}st;
int main(){
n=read(),m=read();
for(int i=1; i<=n; i++) a[i]=read();
st.init(a,n);
while(m--){
l=read(),r=read();
write(st.query(l,r));
}
return 0;
}
QwQ 好像是数组越界这类问题,但不知道在哪里awa