#include <iostream>
#include <cstdio>
using namespace std;
int p,val,n;
int arbmax[2*100000+10];
int maxim(int nr1, int nr2)
{
if(nr1>nr2)
return nr1;
else
return nr2;
}
void update(int st, int dr, int nod)
{
if(st==dr)
{
arbmax[nod]=val;
}
else
{
int mij=(st+dr)/2;
if(p<=mij && 2*nod<=2*n-1)
update(st,mij,2*nod);
if(p>mij && 2*nod+1<=2*n-1)
update(mij+1,dr,2*nod+1);
if(2*nod<=2*n-1)
arbmax[nod]=maxim(arbmax[2*nod],arbmax[2*nod+1]);
}
}
int query(int a, int b, int nod, int st, int dr)
{
if(a<=st && b>=dr)
return arbmax[nod];
else
{
int max1=0,max2=0,mij=(st+dr)/2;
if(a<=mij && 2*nod<=2*n-1)
max1=query(a,b,2*nod,st,mij);
if(b>mij && 2*nod+1<=2*n-1)
max2=query(a,b,2*nod+1,mij+1,dr);
return maxim(max1,max2);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i,m,x,a,b;
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>val;
p=i;
update(1,n,1);
}
for(i=1;i<=m;i++)
{
cin>>x>>a>>b;
if(x==0)
{
cout<<query(a,b,1,1,n)<<"\n\n\n";
}
else
{
p=a;
val=b;
update(1,n,1);
}
}
return 0;
}