#include <cstdio>
using namespace std;
FILE *in, *out;
const int N = 1<<18;
int poz, val, a, b, t[N], queried;
int inline maxim(int x, int y){
return ((a > b) ? a:b);
}
void inline query(int p, int st, int dr){
if(a<=st && dr<=b){
queried = t[p];
return;
}
int m = (st+dr)/2, m1 = -N, m2 = -N;
if(a <= m){
query(2*p, st, m);
m1 = queried;
}
if(m+1 <= b){
query(2*p+1, m+1, dr);
m2 = queried;
}
queried = maxim(m1, m2);
}
void inline update(int p, int st, int dr){
if(st == dr){
t[p] = val;
return;
}
int m = (st+dr)/2;
if(poz <= m){
update(2*p, st, m);
} else {
update(2*p+1, m+1, dr);
}
t[p] = maxim(t[2*p], t[2*p+1]);
}
int main(){
in = fopen("arbint.in","r");
out = fopen("arbint.out", "w");
int n, m, type, i;
fscanf(in, "%d %d", &n, &m);
for(i = 1; i <= n; i++){
fscanf(in, "%d", &val);
poz = i;
update(1, 1, n);
}
for(i = 1; i <= m; i++){
fscanf(in, "%d", &type);
if(type == 0){
fscanf(in, "%d %d", &a, &b);
query(1, 1, n);
fprintf(out, "%d\n", queried);
} else {
fscanf(in, "%d %d", &poz, &val);
update(1, 1, n);
}
}
fclose(in);
fclose(out);
return 0;
}