#include <fstream>
#include <cstdio>
using namespace std;
ofstream out("arbint.out");
const int N = 1<<18, CEVA = 100001;
int poz, val, a, b, t[N];
int maxim(int x, int y){
if(x >= y){
return x;
}
return y;
}
int query(int p, int st, int dr){
if(a<=st && dr<=b){
return t[p];
}
int m = (st+dr)/2, m1 = -N, m2 = -N;
if(a <= m){
m1 = query(2*p, st, m);
}
if(m+1 <= b){
m2 = query(2*p+1, m+1, dr);
}
return 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);
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);
out << query(1, 1, n) << "\n";
} else {
scanf("%d %d", &poz, &val);
update(1, 1, n);
}
}
}