#include<iostream>
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arbore[400001], n, m, x, op, y, i;
void upd(int n, int stanga, int dreapta, int pozitie, int valoare){
if(stanga == dreapta) {
arbore[n] = valoare;
return;
}
int mijloc = (stanga + dreapta) / 2;
if(pozitie <= mijloc)
upd(n * 2, stanga, mijloc, pozitie, valoare);
else
upd(n * 2 + 1, mijloc + 1, dreapta, pozitie, valoare);
arbore[n] = max(arbore[2 * n], arbore[2 * n + 1]);
}
int query(int n, int stanga, int dreapta, int a, int b){
int v1 = 0, v2 = 0, mijloc = (stanga + dreapta) / 2;
if(stanga >= a && b >= dreapta)
return arbore[n];
if(a <= mijloc)
v1 = query(n * 2, stanga, mijloc, a, b);
if(b > mijloc)
v2 = query(n * 2 + 1, mijloc + 1, dreapta, a, b);
return max(v1, v2);
}
int main() {
in >> n >> m;
for(i = 1; i <= n; i++) {
in >> x;
upd(1, 1, n, i, x);
}
for(i = 0; i < m; i++) {
in >> op >> x >> y;
if(op == 0)
out << query(1, 1, n, x, y) << '\n';
else
upd(1, 1, n, x, y);
}
return 0;
}