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