#include<cstdio>
#include<cstdlib>
#define q 100001
using namespace std;
int Arbore[2*q+1],maxim,pozitie,x,aux,capat1,capat2;
int max(int a, int b)
{
if(a<=b) return b;
else return a;
}
void make(int left,int right,int nod)
{
if(right==left)
{
Arbore[nod]=aux;
return;
}
int mij=(right+left)/2;
if(pozitie <= mij)
make(left,mij,2*nod);
else
make(mij+1,right,2*nod+1);
Arbore[nod]=max(Arbore[2*nod],Arbore[2*nod+1]);
}
void interogare(int nod,int left, int right)
{
if( left >= capat1 && right <= capat2)
{
if(maxim < Arbore[nod]) maxim=Arbore[nod];
return;
}
int mij=(left+right)/2;
if(capat1<=mij) interogare(2*nod,left,mij);
if(capat2>mij) interogare(2*nod+1,mij+1,right);
}
int main()
{
int a,b,n,m,op;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<n+1;++i)
{
scanf("%d",&x);
pozitie=i;
aux = x;
make(1,n,1);
}
for(int i=1;i<m+1;++i)
{
scanf("%d",&op);
scanf("%d%d",&a,&b);
if(op==1)
{
pozitie=a;
aux=b;
make(1,n,1);
}
else if(op==0)
{
maxim=-1;
capat1 = a;
capat2 = b;
interogare(1,1,n);
printf("%d\n",maxim);
}
}
return 0;
}