#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arbore[400004];
void update(int nod, int st, int dr, int indice, int val){
if(st == dr){
arbore[nod] = val;
return;
}
int mij = (st + dr)/2;
if( indice <= mij ){
update(2 * nod, st, mij, indice, val);
}
else{
update(2 * nod + 1, mij + 1, dr, indice, val);
}
arbore[nod] = max( arbore[2 * nod], arbore[2 * nod + 1] );
return;
}
int n;
int querry(int nod, int st, int dr, int l, int r){
if( st >= l && dr <= r ){
return arbore[nod];
}
int mij = ( st + dr ) / 2;
int rez_st = -1, rez_dr = -1;
if( l <= mij )
rez_st = querry( nod * 2, st, mij, l, r );
if( r > mij )
rez_dr = querry( nod * 2 + 1, mij + 1, dr, l, r );
return max( rez_st, rez_dr );
}
int main(){
int m, i, j, op, a, b;
fin>>n>>m;
for( i = 1; i <= n; i++ ){
fin>>a;
update(1, 1, n, i, a);
}
for( i = 0; i < m; i++ ){
fin>>op>>a>>b;
if( op == 1 ){
update( 1, 1, n, a, b );
}
else{
fout<<querry( 1, 1, n, a, b )<<'\n';
}
}
}