#include <cstdio>
#define NMAX 100004
using namespace std;
int N, M, v[NMAX], T[4*NMAX];
int val, pos, S, E;
void build(int node, int st, int dr) {
if(st == dr) {
T[node] = v[st];
} else {
int mid = (st + dr) / 2;
build(2 * node, st, mid);
build(2 * node + 1, mid + 1, dr);
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void update(int node, int st, int dr) {
if(st == dr) {
T[node] = val;
} else {
int mid = (st + dr) / 2;
if(pos <= mid) {
update(2 * node, st, mid);
} else {
update(2 * node + 1, mid + 1, dr);
}
T[node] = max(T[2 * node], T[2 * node + 1]);
}
}
void query(int node, int st, int dr) {
if(S <= st && dr <= E) {
val = max(val, T[node]);
} else {
int mid = (st + dr) / 2;
if(S <= mid) {
query(2*node, st, mid);
}
if(E > mid) {
query(2*node + 1, mid + 1, dr);
}
}
}
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", &v[i]);
}
build(1, 1, N);
for(int i = 1; i <= M; i++) {
int cerinta;
scanf("%d", &cerinta);
if(cerinta) {
scanf("%d %d", &pos, &val);
update(1, 1, N);
} else {
scanf("%d %d", &S, &E);
val = 0;
query(1, 1, N);
printf("%d\n", val);
}
}
}