#include <fstream>
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int aint[400010];
void update(int nod,int st,int dr,int poz,int val)
{
int mijl;
if (st==dr)
{
aint[nod]=val;
return ;
}
mijl=(st+dr)/2;
if (poz<=mijl)
update(2*nod,st,mijl,poz,val);
else
update(2*nod+1,mijl+1,dr,poz,val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int query(int nod,int st,int dr,int qst,int qdr)
{
int val1=0,val2=0,mijl;
if (qst<=st && dr<=qdr)
return aint[nod];
mijl=(st+dr)/2;
if (qst<=mijl)
val1=query(2*nod,st,mijl,qst,qdr);
if (mijl<qdr)
val2=query(2*nod+1,mijl+1,dr,qst,qdr);
return max(val1,val2);
}
int main()
{
int n,m,i,x,tip,st,dr;
cin>>n>>m;
for (i=1; i<=n; i++)
{
cin>>x;
update(1,1,n,i,x);
}
for (i=1; i<=m; i++)
{
cin>>tip>>st>>dr;
if (tip==0)
cout<<query(1,1,n,st,dr)<<"\n";
else
update(1,1,n,st,dr);
}
return 0;
}