#include <cstdio>
#include <algorithm>
#define NMAX 100001
using namespace std;
int N, M;
int v[NMAX], A[(NMAX << 1) + 1];
inline int get(int node) {
return node <= 2 * N + 1 ? A[node] : 0;
}
void update(int node, int l, int r, int pos, int val) {
if (l == r) {
A[node] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m) {
update(node * 2, l, m, pos, val);
} else {
update(node * 2 + 1, m+1, r, pos, val);
}
A[node] = max(get(node*2), get(node*2+1));
}
int query(int node, int l, int r, int a, int b) {
if (a <= l && r <= b) {
return A[node];
}
int m = (l + r) / 2;
int q1 = 0, q2 = 0;
if (a <= m) {
q1 = query(node * 2, l, m, a, b);
}
if (b > m) {
q2 = query(node * 2 + 1, m+1, r, a, b);
}
return max(q1, q2);
}
int main() {
int t, i, j, x;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i = 1; i <= N; i++) {
scanf("%d", &x);
update(1, 1, N, i, x);
}
for (; M; M--) {
scanf("%d %d %d", &t, &i, &j);
if (t == 0) {
printf("%d\n", query(1, 1, N, i, j));
} else {
update(1, 1, N, i, j);
}
}
return 0;
}