#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arbore[1000005], a, b, maxi, n, m, x;
void actualizare(int nod, int poz, int left, int right, int val)
{
if(left == right)
arbore[nod] = val;
else {
int mij = (left + right) / 2;
if(poz <= mij) actualizare(nod*2, poz, left, mij, val);
else actualizare(nod*2+1, poz, mij+1, right, val);
arbore[nod] = max(arbore[nod*2], arbore[nod*2+1]);
}
}
void interogare(int nod, int left, int right, int a, int b)
{
if(a <= left && b >= right) maxi = max(maxi, arbore[nod]);
else{
int mij = (left + right) / 2;
if(a <= mij) interogare(nod*2, left, mij, a, b);
if(b >= mij+1) interogare(nod*2+1, mij+1, right, a, b);
}
}
int main()
{
f >> n >> m;
for(int i=1; i<=n; i++)
{
f >> x;
actualizare(1, i, 1, n, x);
}
for(int i=1; i<=m; i++)
{
int q;
f >> q;
if(q){
f >> a >> b;
actualizare(1, a, 1, n, b);
}
else {
f >> a >> b;
maxi = 0;
interogare(1, 1, n, a, b);
g << maxi << '\n';
}
}
}