#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int n,m;
const int MAXN =100041;
int a[MAXN], arbint[4*MAXN];
void constructie(int st,int dr,int nod)
{
if(st==dr)
arbint[nod]=a[st];
else
{
int m=(st+dr)/2;
constructie(st,m,nod*2);
constructie(m+1,dr,nod*2+1);
arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
}
}
void update(int pos, int val, int st=1,int dr=n, int nod=1)
{
if(st==dr)
{
arbint[nod]=val;
return;
}
int m=(st+dr)/2;
if(pos>m)
update(pos,val,m+1,dr,nod*2+1);
else
if(pos<=m)
update(pos,val,st,m,nod*2);
arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
}
int query(int qst, int qdr,int st=1,int dr=n,int nod=1)
{
if(st>=qst&&dr<=qdr)
{
return arbint[nod];
}
int mij=(st+dr)/2;
if(qdr<=mij)
return query(qst,qdr,st,mij,nod*2);
if(qst>mij)
return query(qst,qdr,mij+1,dr,nod*2+1);
return max(query(qst,qdr,st,mij,nod*2),query(qst,qdr,mij+1,dr,nod*2+1));
}
int main()
{
f>>n>>m;
for(int i=1;i<=n;i++)
f>>a[i];
constructie(1,n,1);
for(int i=1;i<=m;i++)
{
int op,a,b;
f>>op>>a>>b;
if(op==0)
g<<query(a,b)<<"\n";
else
update(a,b);
}
return 0;
}