#include<fstream>
#define MaxN 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[3*MaxN];
int i,Max,op,a,b,n,m;
void update(int nod, int st, int dr, int poz, int val)
{ if(st==dr)
arb[nod]=val;
else
{ int mij=(st+dr)/2;
if(poz<=mij)
update(2*nod,st,mij,poz,val);
else
update(2*nod+1,mij+1,dr,poz,val);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void query(int nod, int st, int dr, int in, int sf)
{ if(st>=in&&dr<=sf)
{ if(arb[nod]>Max)
Max=arb[nod];
}
else
{ int mij=(st+dr)/2;
if(in<=mij)
query(2*nod,st,mij,in,sf);
if(sf>mij)
query(2*nod+1,mij+1,dr,in,sf);
}
}
int main()
{ fin>>n>>m;
for(i=1;i<=n;i++)
{ fin>>a;
update(1,1,n,i,a);
}
for(i=1;i<=m;i++)
{ fin>>op;
if(op==0)
{ fin>>a>>b;
Max=-1;
query(1,1,n,a,b);
fout<<Max<<'\n';
}
if(op==1)
{ fin>>a>>b;
update(1,1,n,a,b);
}
}
return 0;
}