#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int Nmax = 100005;
int v[Nmax], t[2 * Nmax], n, M, operatie;
int tip0(int nod, int st, int dr, int x, int y){
if(st >= x and y >= dr)
return t[nod];
else{
int r1 = 0, r2 = 0, m;
m = (st + dr) / 2;
if(x <= m)
r1 = tip0(2 * nod, st, m, x, y);
if(y > m)
r2 = tip0(2 * nod + 1, m + 1, dr, x, y);
return max(r1,r2);
}
}
void tip1(int nod, int st, int dr, int poz, int val){
if(st == dr)
t[nod] = val;
else{
int m = (st + dr) / 2;
if(poz <= m)
tip1(2*nod, st, m, poz, val);
else
tip1(2*nod+1, m+1, dr, poz, val);
t[nod] = max(t[2*nod], t[2*nod+1]);
}
}
void creare_arbore(int nod, int st, int dr){
if(st == dr)
t[nod] = v[st];
else{
int m = (st + dr) / 2;
creare_arbore(2*nod, st, m);
creare_arbore(2*nod+1, m+1, dr);
t[nod] = max(t[2*nod], t[2*nod+1]);
}
}
void solve(){
f >> n >> M;
int i;
for(i = 1; i <= n; i++)
f >> v[i];
creare_arbore(1, 1, n);
for(i = 1; i <= M; i++){
f >> operatie;
if(operatie == 0){
int l, r;
f >> l >> r;
g << tip0(1, 1, n, l, r) << '\n';
}
else{
int poz, val;
f >> poz >> val;
tip1(1, 1, n, poz, val);
}
}
}
int main(){
solve();
return 0;
}