#include <stdio.h>
#include <algorithm>
using namespace std;
#define nmax 100001
int arb[2*nmax], pos, val, start, finish, maxim;
void update (int nod, int left, int right) {
if (left == right) {
arb[nod] = val;
return;
}
int div = (left + right)/2;
if (pos <= div) update (2*nod, left, div);
else update (2*nod+1, div + 1, right);
arb[nod] = max (arb[2*nod], arb[2*nod+1]);
}
void query (int nod, int left, int right) {
if (left >= start && right <= finish) {
if (maxim < arb[nod]) maxim = arb[nod];
return;
}
int div = (left+right)/2;
if (start <= div) query (2*nod, left, div);
if (div < finish) query (2*nod+1, div+1, right);
}
int main() {
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int N, M, i, X, A, B;
scanf ("%d %d", &N, &M);
for (i = 1; i <= N; ++i) {
scanf ("%d", &X);
val = X;
pos = i;
update (1, 1, N);
}
for (i = 1; i <= M; ++i) {
scanf ("%d %d %d", &X, &A, &B);
if (X != 0) {
pos = A;
val = B;
update (1, 1, N);
}
else {
start = A;
finish = B;
maxim = - 1;
query (1, 1, N);
printf ("%d\n", maxim);
}
}
return 0;
}