#include <fstream>
using namespace std;
int v[400004];
void update(int node, int from, int to, int pos, int val)
{
if(from == to)
{
v[node] = val;
return ;
}
int mid = (from + to) / 2;
if(pos <= mid)
{
update(node*2, from, mid, pos, val);
}
else
update(node*2+1, mid+1, to, pos, val);
v[node] = max(v[node*2], v[node*2+1]);
}
int query(int node, int from, int to, int qleft, int qright)
{
int smax=0;
if(qleft<=from && to<=qright)
return v[node];
int mid=(from+to)/2;
if(qleft<=mid)
{
int s=query(node*2, from, mid, qleft, qright);
smax=max(smax, s);
}
if(mid+1<=qright)
{
int s=query(node*2+1, mid+1, to, qleft, qright);
smax=max(smax, s);
}
return smax;
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m, a,q,x,y;
cin >> n >> m;
for(int i=1; i<=n; i++)
{
cin >> a;
update(1, 1, n, i, a);
}
for(int i=1; i<=m; i++)
{
cin >> q >> x >> y;
if(q == 0)
{
cout << query(1, 1, n, x, y) << '\n';
}
else
{
update(1, 1, n, x ,y);
}
}
return 0;
}