#include <stdio.h>
#include <algorithm>
#define NMAX 500001
FILE *in, *out;
int N, M, r;
int arbInt[NMAX];
void update(int nod, int st, int dr, int a, int b){
if ( st == dr ){
arbInt[nod] = b;
} else {
int mid = (st + dr) / 2;
if (a <= mid)
update(2 * nod, st, mid, a, b);
else
update(2 * nod + 1, mid + 1, dr, a, b);
arbInt[nod] = std::max(arbInt[2 * nod], arbInt[2 * nod + 1]);
}
}
void query(int nod, int st, int dr, int a, int b){
if ( a <= st && dr <= b){
r = std::max(r, arbInt[nod]);
} else {
int mid = (st + dr) / 2;
if (a <= mid) query(2 * nod, st, mid, a, b);
if (mid < b)query(2 * nod + 1, mid + 1, dr, a, b);
}
}
int main(){
in = fopen("arbint.in", "r");
out = fopen("arbint.out", "w");
fscanf(in, "%d%d", &N, &M);
for(int i = 1; i <= N; i++){
int a;
fscanf(in, "%d", &a);
update(1, 1, N, i, a);
}
for(int i = 1; i <= M; i++){
int a, b, x;
fscanf(in, "%d%d%d", &x, &a, &b);
if (x == 0){
r = 0;
query(1, 1, N, a, b);
fprintf(out, "%d\n", r);
} else if (x == 1){
update(1, 1, N, a, b);
}
}
fclose(in);
fclose(out);
return 0;
}