#include <cstdio>
#include <algorithm>
#define DIM 10000
using namespace std;
char buff[DIM];
int poz=0;
int arb[1<<19],op,x,a,b,n,m,i,poz2;
void read ( int &numar)
{
numar=0;
while(buff[poz]<'0' | buff[poz]>'9')
{
if(++poz == DIM)
{
fread(buff,1,DIM,stdin);
poz=0;
}
}
while('0'<=buff[poz] && buff[poz]<='9')
{
numar=numar*10+buff[poz]-'0';
if(++poz == DIM)
{
fread(buff,1,DIM,stdin);
poz=0;
}
}
}
void actualizare ( int nod, int st, int dr )
{ int m;
if(st>=poz2 && dr <=poz2)
{
arb[nod]=x;
return;
}
m=(st+dr)/2;
if(poz2<=m) actualizare ((nod<<1),st,m);
else actualizare ((nod<<1)+1,m+1,dr);
arb[nod]=max(arb[(nod<<1)], arb[(nod<<1)+1]);
}
int interogare(int nod, int st, int dr)
{
int x1=0,x2=0;
if(a<=st && b>=dr)
{
return arb[nod];
}
int m=(st+dr)/2;
if(a<=m)
{
x1=interogare(nod<<1,st,m);
}
if(b>m)
{
x2=interogare((nod<<1)+1,m+1,dr);
}
return max(x1,x2);
}
int main()
{
freopen("saracsaurege.in","r",stdin);
freopen("saracsaurege.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1; i<=n; i++)
{
read(x);
poz2=i;
actualizare (1,1,n);
}
for(i=1; i<=m; i++)
{
read(a);
read(b);
printf("%d\n",interogare(1,1,n));
}
return 0;
}