#include <fstream>
#include <algorithm>
using namespace std;
int i,aux,n,k,j,p,v[101009],m,st,s,stmax,drmax,smax,nr,sol,x,y,caz,arbore[400010],a,b,maxim,val;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void query(int nod, int left, int right)
{
if ( a <= left && right <= b )
{
maxim=max(maxim,arbore[nod]);
return ;
}
int mijloc = (left+right)/2;
if ( a <= mijloc ) query(2*nod,left,mijloc);
if ( mijloc < b ) query(2*nod+1,mijloc+1,right);
}
void update(int nod,int left,int right)
{
if(left==right) //am gasit nodul si ii schimbam valoarea
{
arbore[nod]=val;
}
else
{
int mijloc=(left+right)/2;
if(a<=mijloc)
{
update(2*nod,left,mijloc);
}
//if(mijloc+1<=a)
else
{
update(2*nod+1,mijloc+1,right);
}
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}
}
int main()
{
fin>>n>>m;
//citire si construirea arborelui binar
for(i=1;i<=n;i++)
{
fin>>v[i];
val=v[i];
a=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
fin>>caz>>a>>b;
if(caz==0)
{
maxim=0;
query(1,1,n);
fout<<maxim<<"\n";
}
else
{
val=b;
update(1,1,n);
}
}
}