#include <fstream>
using namespace std;
const int NMAX=100000;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int arb_int[4*NMAX+2];
void update(int indice,int st,int dr,int pos,int val)
{
if(st==dr)
{
arb_int[indice]=val;
return;
}
int mid=(st+dr)/2;
if(pos<=mid)
update(2*indice,st,mid,pos,val);
else
update(2*indice+1,mid+1,dr,pos,val);
arb_int[indice]=max(arb_int[2*indice],arb_int[2*indice+1]);
}
int query(int indice, int st,int dr,int l,int r)
{
if(r<st||l>dr)
return 0;
if(l<=st&&dr<=r)
return arb_int[indice];
int mid=(st+dr)/2;
int a1=query(2*indice,st,mid,l,r),a2=query(2*indice+1,mid+1,dr,l,r);
return max(a1,a2);
}
int main()
{
int n,m,i,x,t,y;
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>x;
update(1,1,n,i,x);
}
for(i=1;i<=m;i++)
{
cin>>t>>x>>y;
if(t==0)
{
cout<<query(1,1,n,x,y)<<'\n';
}
else
{
update(1,1,n,x,y);
}
}
return 0;
}