#include <stdio.h>
const int N_MAX = 100001;
int aint[N_MAX * 5], max;
inline int MAX(int a, int b)
{
return (a > b ? a : b);
}
void query(int nod, int st, int dr, int a, int b)
{
if (a <= st && dr <= b) {
if (aint[nod] > max) max = aint[nod];
} else {
int mij = (st + dr) / 2;
if (a <= mij) query(nod * 2, st, mij, a, b);
if (mij < b) query(nod * 2 + 1, mij + 1, dr, a, b);
}
}
void update(int nod, int st, int dr, int poz, int val)
{
if (st == dr) {
aint[nod] = val;
} else {
int mij = (st + dr) / 2;
if (poz <= mij) update(nod * 2, st, mij, poz, val);
else update(nod * 2 + 1, mij + 1, dr, poz, val);
aint[nod] = MAX(aint[nod * 2], aint[nod * 2 + 1]);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
#ifndef _SCREEN_
freopen("arbint.out", "w", stdout);
#endif
int N, M, X;
scanf("%d %d\n", &N, &M);
for (int i = 1; i <= N; i ++) {
scanf("%d ", &X);
update(1, 1, N, i, X);
}
int op, a, b;
for (int i = 1; i <= M; i ++) {
scanf("%d %d %d\n", &op, &a, &b);
if (op == 0) {
max = -1;
query(1, 1, N, a, b);
printf("%d\n", max);
}
else update(1, 1, N, a, b);
}
return 0;
}