#include <cstdlib>
#include <cstdio>
#include <string>
#include <math.h>
#include <memory>
using namespace std;
int fill(int* v, int* t, int pos, int a, int b) {
if (a == b) {
t[pos] = v[a];
return t[pos];
}
int mid = (a + b) / 2;
t[pos] = max(fill(v, t, pos * 2, a, mid), fill(v, t, pos * 2 + 1, mid + 1, b));
return t[pos];
}
int query(int*t, int pos, int a, int b, int x, int y) {
if (x <= a && b <= y)
return t[pos];
int mid = (a + b) / 2;
int m = 0;
if (x <= mid) {
m = max(m, query(t, pos * 2, a, mid, x, y));
}
if (mid + 1 <= y) {
m = max(m, query(t, pos * 2 + 1, mid + 1, b, x, y));
}
return m;
}
int update(int*t, int pos, int a, int b, int x, int val) {
if (a == b && a == x) {
t[pos] = val;
return val;
}
int mid = (a + b) / 2;
int left = 0;
int right = 0;
if (x <= mid) {
left = update(t, pos * 2, a, mid, x, val);
right = t[pos * 2 + 1];
} else {
left = t[pos * 2];
right = update(t, pos * 2 + 1, mid + 1, b, x, val);
}
t[pos] = max(left, right);
return t[pos];
}
void sol() {
int n, m;
scanf("%d %d", &n, &m);
int* v = new int[n+1];
for (int i = 1; i <= n; i++) {
scanf("%d", &v[i]);
}
int h = 1;
while (h < n) {
h *= 2;
}
int* t = new int[2* h];
fill(v, t, 1, 1, n);
// for (int i = 1; i <= 2*h; i++) {
// printf("%d ", t[i]);
// }
for (int i = 0; i < m; i++) {
int op, a, b;
scanf("%d %d %d", &op, &a, &b);
if (op == 0) {
printf("%d\n", query(t, 1, 1, n, a, b));
} else {
update(t, 1, 1, n, a, b);
}
}
}
int main() {
#ifdef PADREATI
freopen("in.txt", "r", stdin);
#else
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
#endif
sol();
return 0;
}