#include <fstream>
using namespace std;
//////////////////////////////////////
const int MAX = 1e5 + 1;
int aint[4 * MAX] , v[MAX] , n , q , st , dr , aux, poz , newval;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
/////////////////////////////////////////////
int init( int nod , int st , int dr ){
if( st == dr ){
aint[nod] = v[st];
return v[st];
}else{
int mij = (st+dr)/2;
aint[nod] = max(init(nod*2,st,mij),init(nod*2+1,mij+1,dr));
return aint[nod];
}
}
void update( int nod , int st , int dr , int pos , int val){
if( st == dr ){
aint[nod] = val;
}else{
int mij = (st+dr)/2;
if( pos <= mij ){
update(nod*2 , st , mij , pos , val);
}
if( pos > mij ){
update(nod*2 + 1 , mij + 1 , dr , pos , val);
}
aint[nod] = max(aint[nod*2],aint[nod*2+1]);
}
}
int query( int nod , int st , int dr , int qst , int qdr){
if( qst <= st && dr <= qdr ){
return aint[nod];
}
int mij = (st+dr)/2;
if(qdr <= mij) return query(nod*2,st,mij,qst,qdr);
if(qst > mij) return query(nod*2+1,mij+1,dr,qst,qdr);
return max(query(nod*2,st,mij,qst,qdr),query(nod*2+1,mij+1,dr,qst,qdr));
}
int main()
{
cin >> n >> q;
for(int i = 1 ; i <= n ; i++) cin >> v[i];
init(1,1,n);
while(q--){
cin >> aux;
if(!aux){
cin >> st >> dr;
cout << query(1,1,n,st,dr) << '\n';
}
if(aux){
cin >> poz >> newval;
update(1,1,n,poz,newval);
}
}
return 0;
}