#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int const NMAX=100005;
int segt[4*NMAX];
void update(int node, int st, int dr, int pos, int val)
{
if(st==dr)
{
segt[node]=val;
return;
}
int mid=(st+dr)/2;
if(pos<=mid)
update(node*2, st, mid, pos, val);
else
update(node*2+1, mid+1, dr, pos, val);
segt[node]=max(segt[node*2], segt[node*2+1]);
}
int query(int node, int st, int dr, int ql, int qr)
{
int maxs=0;
if(ql<=st && dr<=qr)
return segt[node];
int mid=(st+dr)/2;
if(ql<=mid)
{
int s=query(node*2, st, mid, ql, qr);
maxs=max(maxs, s);
}
if(mid+1<=qr)
{
int s=query(node*2+1, mid+1, dr, ql, qr);
maxs=max(maxs, s);
}
return maxs;
}
main()
{
int n, m, i, x, a, b;
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>x;
update(1, 1, n, i, x);
}
for(i=1;i<=m;i++)
{
cin>>x>>a>>b;
if(x==0)
cout<<query(1, 1, n, a, b)<<'\n';
else
update(1, 1, n, a, b);
}
return 0;
}