#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 100050
#define ns (nod << 1)
#define nd (nod << 1) + 1
#define mij ((st + dr) >> 1)
int A[4 * NMAX], N, M, i, x, t, a, b;
int query (int, int, int, int, int);
void update (int, int, int, int, int);
int main () {
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 (i = 1; i <= M; i++) {
scanf ("%d %d %d", &t, &a, &b);
if (t == 0) printf ("%d\n", query (1, 1, N, a, b));
if (t == 1) update (1, 1, N, a, b);
}
return 0;
}
void update (int nod, int st, int dr, int pos, int val) {
if (st == dr && st == pos) {
A[nod] = val;
return;
}
if (pos <= mij) update (ns, st, mij, pos, val);
if (mij < pos) update (nd, mij + 1, dr, pos, val);
A[nod] = max (A[ns], A[nd]);
}
int query (int nod, int st, int dr, int a, int b) {
if (a <= st && dr <= b) return A[nod];
int x = 0, y = 0;
if (a <= mij) x = query (ns, st, mij, a, b);
if (mij < b) y = query (nd, mij + 1, dr, a, b);
return max (x, y);
}