#include <cstdio>
int N, T, x, o, a, b, maxim;
int A[400066];
inline int max( int a, int b ) {
return (a>b)?a:b;
}
void update(int nod, int left, int right, int val, int pos) {
if (left == right) {
A[nod] = val;
return;
}
int mid = (left + right)>>1;
if (pos <= mid) {
update( nod<<1, left, mid, val, pos);
} else {
update((nod<<1)+1, mid+1, right, val, pos);
}
A[nod] = max( A[nod<<1], A[(nod<<1) + 1] );
}
void query(int nod, int left, int right) {
if (a <= left && right <= b) {
if ( maxim < A[nod] ) maxim = A[nod];
return;
}
int mid = (left+right)>>1;
if (a <= mid) {
query(nod<<1, left, mid);
}
if (b > mid) {
query((nod<<1)+1, mid+1, right);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &T);
for (int i = 1; i <= N; ++i) {
scanf("%d", &x);
update(1, 1, N, x, i);
}
for (; T; --T) {
scanf("%d %d %d", &o, &a, &b);
if (o == 0) {
maxim = -1;
query(1, 1, N);
printf("%d\n", maxim);
} else {
update(1, 1, N, b, a);
}
}
return 0;
}