// Arbori intervale - O(logN) pe operatie
#include <fstream>
#define Nmax 50099
#define oo 2000000000
using namespace std;
ifstream f("saracsaurege.in");
ofstream g("saracsaurege.out");
int N,M,v[Nmax],Arb[4*Nmax],sol,A,B,x,y,val,op;
void Update(int node,int st,int dr)
{
if(A<=st && dr<=B)
{
Arb[node]=val;
return;
}
int mij=(st+dr)>>1 , s1=node<<1, s2=s1+1;
if(A<=mij)Update(s1,st,mij);
else Update(s2,mij+1,dr);
if(Arb[s1]>Arb[s2])Arb[node]=Arb[s1];
else Arb[node]=Arb[s2];
}
void Query(int node,int st,int dr)
{
if(A<=st && dr<=B)
{
if(Arb[node]>sol)sol=Arb[node];
return;
}
int mij=(st+dr)>>1 , s1=node<<1, s2=s1+1;
if(A<=mij)Query(s1,st,mij);
if(mij<B) Query(s2,mij+1,dr);
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;++i)
f>>val , A=B=i , Update(1,1,N);
for(int i=1;i<=M;++i)
{
f>>x>>y;
A=x , B=y, sol=0, Query(1,1,N) ,g<<sol<<'\n';
}
f.close();g.close();
return 0;
}