#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 1 << 17;
const int INF = 0x3f3f3f3f;
int V[NMAX], A[NMAX << 1];
void build(int i, int st, int dr) {
if (st == dr) {
A[i] = V[st];
return;
}
int is, mij;
is = i << 1; mij = (st + dr) >> 1;
build(is, st, mij);
build(is|1, mij+1, dr);
A[i] = max(A[is], A[is|1]);
}
int query(int i, int st, int dr, int a, int b) {
if (a <= st && dr <= b)
return A[i];
int is, mij, rez = 0;
is = i << 1; mij = (st + dr) >> 1;
if (a <= mij)
rez = query(is, st, mij, a, b);
if (mij < b)
rez = max(rez, query(is|1, mij+1, dr, a, b) );
return rez;
}
void update(int i, int st, int dr, int a, int b) {
if (st == dr && st == a) {
A[i] = b;
return;
}
int is, mij;
is = i << 1; mij = (st + dr) >> 1;
if (a <= mij)
update(is, st, mij, a, b);
else
update(is|1, mij+1, dr, a, b);
A[i] = max(A[is], A[is|1]);
}
int main(void) {
freopen("arbint.in", "rt", stdin);
freopen("arbint.out", "wt", stdout);
int N, M;
int i, t, a, b;
scanf(" %d %d", &N, &M);
for (i = 1; i <= N; ++i)
scanf(" %d", V + i);
build(1, 1, N);
for (i = 0; i < N; ++i) {
scanf(" %d %d %d", &t, &a, &b);
if (t == 0)
printf("%d\n", query(1, 1, N, a, b) );
else
update(1, 1, N, a, b);
}
return 0;
}