#include <cstdio>
#include <algorithm>
using namespace std;
int N, T, x, o, a, b, maxim;
int A[400066];
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, int a, int b, int &maxim) {
if (a <= left && right <= b) {
maxim = max( maxim, A[nod] );
return;
}
int mid = (left+right)>>1;
if (a <= mid) {
query(nod<<1, left, mid, a, b, maxim);
}
if (b > mid) {
query((nod<<1)+1, mid+1, right, a, b, maxim);
}
}
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 (int i = 1; i <= T; ++i) {
scanf("%d %d %d", &o, &a, &b);
if (o == 0) {
maxim = -1;
query(1, 1, N, a, b, maxim);
printf("%d\n", maxim);
} else {
update(1, 1, N, b, a);
}
}
return 0;
}