#include <cstdio>
#include <algorithm>
using namespace std;
int A[2000001], N, M, x, maxim;
int o, a, b;
void update(int nod, int left, int right, int pos, int val) {
if (left == right) {
A[nod] = val;
return;
}
int mid = (left+right)/2;
if (pos <= mid) {
update(2*nod, left, mid, pos, val);
} else {
update(2*nod+1, mid+1, right, pos, val);
}
A[nod] = max( A[2*nod], A[2*nod+1] );
}
void query(int nod, int left, int right, int start, int finish) {
if (start <= left && right <= finish) {
if (maxim < A[nod]) maxim = A[nod];
return;
}
int mid = (left+right)/2;
if ( start <= mid ) {
query(2*nod, left, mid, start, finish);
} else if ( mid < finish ) {
query(2*nod+1, mid+1, right, start, finish);
}
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; ++i) {
scanf("%d", &x);
update(1, 1, N, i, x);
for (int i = 1; i <= N*2; ++i) {
printf("%d ", A[i]);
}
printf("\n");
}
for (int i = 1; i <= M; ++i) {
scanf("%d %d %d", &o, &a, &b);
if ( o == 0 ) {
maxim = -1;
query(1, 1, N, a, b);
printf("%d\n", maxim);
} else {
update(1, 1, N, a, b);
}
}
return 0;
}