#include <iostream>
#include <fstream>
using namespace std;
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
long v[200005];
void update (int l, int r, int pos, int x, int i) {
if (pos <= l && pos >= r) {
v[i] = x;
return;
} else {
int mid = (l + r) / 2;
if (pos <= mid) update(l, mid, pos, x, 2*i);
if (pos > mid) update(mid+1, r, pos, x, 2*i+1);
v[i] = MAX(v[2*i], v[2*i+1]);
}
}
long query (int l, int r, int a, int b, int i) {
if (a <= l && b >= r) {
return v[i];
} else {
int mid = (l + r) / 2;
long m1 = 0, m2 = 0;
if (a <= mid) m1 = query(l, mid, a, b, 2*i);
if (b > mid) m2 = query(mid+1, r, a, b, 2*i+1);
return MAX(m1, m2);
}
}
int main (void) {
ifstream in("arbint.in");
ofstream out("arbint.out");
int m, n;
in >> n >> m;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
update(1, n, i, x, 1);
}
/*for (int i = 1; i <= 2*n; ++i) {
printf("%ld ", v[i]);
}
printf("\n");
*/
for (int i = 0; i < m; ++i) {
int a, b, c;
in >> a >> b >> c;
if (a) {
update(1, n, b, c, 1);
} else {
long r = query(1, n, b, c, 1);
out << r << "\n";
}
}
in.close();
out.close();
return 0;
}