#include <fstream.h>
#define nmax 2000010
ifstream f("arbint.in");
ofstream g("arbint.out");
int t[nmax],ret,n,m;
int max(int A,int B)
{
if (A>B) return A;
return B;
}
void update(int nod,int st,int dr,int a,int x)
{
if(a<=st && dr<=a)
{
t[nod]=x;
}
else
{
int mij=(st+dr)/2;
if(a<=mij) update(nod*2,st,mij,a,x);
if(a> mij) update(nod*2+1,mij+1,dr,a,x);
t[nod]=max(t[nod*2],t[nod*2+1]);
}
}
void search(int nod,int st,int dr,int a,int b)
{
if (a<=st && dr<=b)
{
ret=max(ret,t[nod]);
}
else
{
int mij=(st+dr)/2;
if (a<=mij) search(nod*2,st,mij,a,b);
if (b >mij) search(nod*2+1,mij+1,dr,a,b);
}
}
int main()
{
f>>n>>m;
int i,x,a,b;
for (i=1;i<=n;++i)
{
f>>x;
update(1,1,n,i,x);
}
for (i=1;i<=m;++i)
{
f>>x>>a>>b;
if (x==0)
{
ret=-1;
search(1,1,n,a,b);
g<<ret<<'\n';
}
else
{
update(1,1,n,a,b);
}
}
return 0;
}