#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int V[4 * 100001], A[100005], x, y;
void creare_arbore (int nod, int l, int r) {
if (l == r) {
V[nod] = A[l];
return;
}
int m = (l + r) / 2;
creare_arbore (2 * nod, l ,m);
creare_arbore (2 * nod + 1, m + 1, r);
V[nod] = max (V[2 * nod], V[2 * nod + 1]);
}
void updatare_arbore (int nod, int l, int r) {
if (l == r) {
V[nod] = y;
return;
}
int m = (l + r) / 2;
if (x <= m)
updatare_arbore (nod * 2, l, m);
else
updatare_arbore (nod * 2 + 1, m + 1, r);
V[nod] = max (V[2 * nod], V[2 * nod + 1]);
}
int querry_arbore (int nod, int l, int r) {
if (x <= l && r <= y)
return V[nod];
if (x > r || y < l)
return -1;
int m = (l + r) / 2;
return max (querry_arbore (nod * 2, l, m), querry_arbore (nod * 2 + 1, m + 1, r));
}
int main () {
freopen ("arbint.in", "r", stdin); freopen ("arbint.out", "w", stdout);
int N, M, i, op;
scanf ("%d%d", &N, &M);
for (i = 1; i <= N; ++i)
scanf ("%d", &A[i]);
creare_arbore (1, 1, N);
while (M--) {
scanf ("%d%d%d", &op, &x, &y);
if(op)
updatare_arbore (1, 1, N);
else
printf ("%d\n", querry_arbore(1, 1, N));
}
}