#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int N = 1<<18;
int t[N];
int n, m, x, task, a, b;
int interogare(int p, int st, int dr, int a, int b) ///returneaza max([st, dr] intersectat cu [a,b])
{
if(a<=st && dr<=b)
{
return t[p];
}
int m = (st+dr)/2, fs = 2*p, fd = 2*p+1;
int rs = -1, rd = -1;
if(a <= m)
{
rs = interogare(fs, st, m, a, b);
}
if(b > m)
{
rd = interogare(fd, m+1, dr, a, b);
}
return max(rs,rd);
}
void actualizare(int p, int st, int dr, int poz, int val)
{
if(st == dr)
{
t[p] = val;
return;
}
int m = (st+dr)/2, fs= 2*p, fd = 2*p+1;
if(poz <= m)
{
actualizare(fs, st, m, poz, val);
}
else
{
actualizare(fd, m+1, dr, poz, val);
}
t[p] = max(t[fs], t[fd]);
}
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i++)
{
cin>>x;
actualizare(1, 1, n, i, x);
}
for(int i = 1; i <= m; i++)
{
cin>>task>>a>>b;
if(task == 0)
{
cout<<interogare(1, 1, n, a, b)<<'\n';
}
else
{
actualizare(1, 1, n, a, b);
}
}
return 0;
}