#include<cstdio>
#include<fstream>
#define q 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int Arbore[4*q],maxim,aux;
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;
if(pozitie <= mij)
make(left,mij,2*nod,pozitie,elem);
else
make(mij+1,right,2*nod+1,pozitie,elem);
Arbore[nod]=max(Arbore[2*nod],Arbore[2*nod+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 mij=(left+right)/2;
if(capat1<=mij) interogare(2*nod,left,mij,capat1,capat2);
if(capat2>mij) interogare(2*nod+1,mij+1,right,capat1,capat2);
}
int main()
{
int a,b,n,m,x;
f >> n >> m;
for(int i=1;i<=n;++i)
{
f >> x;
// aux = x;
make(1,n,1,i,x);
}
for(int i=1;i<=m;++i)
{
f >> x >> a >> b;
if(x==1)
{
//aux=b;
make(1,n,1,a,b);
}
else if(x==0)
{
maxim=-1;
interogare(1,1,n,a,b);
g << maxim << "\n";
}
}
return 0;
}