#include <cstdio>
using namespace std;
const int N = 1<<18, CEVA = 100001;
int poz, val, a, b, t[N], queried;
int maxim(int x, int y){
if(x >= y){
return x;
}
return y;
}
void 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 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(){
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m, type, i;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++){
scanf("%d", &val);
poz = i;
update(1, 1, n);
}
for(i = 1; i <= m; i++){
scanf("%d", &type);
if(type == 0){
scanf("%d %d", &a, &b);
query(1, 1, n);
printf("%d\n", queried);
} else {
scanf("%d %d", &poz, &val);
update(1, 1, n);
}
}
}