#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int INF = 1e9 + 1 , DIM = 100001;
int n,q,i,t,x,y,aint[4*DIM],elements[DIM];
void build( int nod,int st, int dr){
if( st == dr ){
aint[nod] = elements[st];
return;
}
int mid = ( st + dr )/2;
build( 2*nod, st, mid );
build( 2*nod + 1, mid+1, dr );
aint[nod] = max( aint[nod*2] , aint[nod*2+1] );
return;
}
void update( int nod,int st, int dr,int x, int p ){
if( dr < p || st > p ){
return;
}
if( st == dr ){
aint[nod] = x;
return;
}
int mid = (st + dr) /2;
update( nod*2, st,mid,x,p );
update( nod*2 + 1, mid+1,dr,x,p );
aint[nod] = max( aint[nod*2],aint[nod*2+1] );
return;
}
int query( int nod, int st,int dr, int x, int y ){
if( dr < x || st > y ){
return -INF;
}
if(x <= st && dr <= y){
return aint[nod];
}
int mid = ( st + dr )/2;
int stanga = query( nod *2,st,mid,x,y);
int dreapta = query( nod*2+1,mid+1,dr,x,y);
return max( stanga, dreapta );
}
int main(){
in >> n >> q;
for( i = 1; i <= n; i ++ ){
in >> elements[i];
}
build( 1,1,n );
for( i = 1; i <= q; i ++ ){
in >> t >> x >> y;
if( t == 1 ){
update( 1,1,n,y,x );
}
else{
out<<query( 1,1,n,x,y )<<"\n";
}
}
return 0;
}