#include <iostream>
#include <fstream>
using namespace std;
unsigned intArb[100000];
unsigned interogare(size_t nod, size_t st, size_t dr, size_t a, size_t b) {
if (a <= st && dr <= b) {
return intArb[nod];
} else {
size_t mij = (st + dr)/2;
unsigned maxVal = 0;
if(a <= mij)
maxVal = max(maxVal, interogare(2*nod, st, mij, a, b));
if(b > mij)
maxVal = max(maxVal, interogare(2*nod+1, mij+1, dr, a, b));
return maxVal;
}
}
void actualizare(size_t nod, size_t st, size_t dr, size_t i, unsigned val) {
if (st <= i && i <= dr) {
if (st != dr) {
size_t mij = (st + dr)/2;
if(i <= mij)
actualizare(2*nod, st, mij, i, val);
if(i > mij)
actualizare(2*nod+1, mij+1, dr, i, val);
intArb[nod] = max(intArb[2*nod], intArb[2*nod+1]);
}
else {
intArb[nod] = val;
}
}
}
int main() {
ifstream in("arbint.in");
ofstream out("arbint.out");
size_t n, m;
in >> n >> m;
for (int i = 0; i < n; i++) {
unsigned t;
in >> t;
actualizare(1, 0, n-1, i, t);
}
for (int i = 0; i < m; i++) {
unsigned op, a, b;
in >> op >> a >> b;
if (op == 0) {
out << interogare(1, 0, n-1, a-1, b-1) << '\n';
} else if (op == 1) {
actualizare(1, 0, n-1, a-1, b);
}
}
return 0;
}