#include <cstdlib>
#include <fstream>
#define Nmax 400111
/*
*
*/
using namespace std;
int Aint[Nmax];
inline void UpDate( int vertex, int left, int right, int x, int xIdx )
{
if( left == right )
Aint[vertex]=x;
else {
int middle=left+(right-left)/2;
if( xIdx <= middle )
UpDate( 2*vertex, left, middle, x, xIdx );
else UpDate( 2*vertex+1, middle+1 , right, x, xIdx );
Aint[vertex]=max( Aint[2*vertex], Aint[2*vertex+1] );
}
}
inline int Query( int vertex, int left, int right, int a, int b ) // [ left, right ] intervalul curent, [ a, b ] cel pe care se face query
{
if( a <= left && right <= b )
return Aint[vertex];
int middle=left+(right-left)/2, m=0;
if( a <= middle )
m=max( m, Query( 2*vertex, left, middle, a, b ) );
if( b > middle )
m=max( m, Query( 2*vertex+1, middle+1, right, a, b ) );
return m;
}
int main( void )
{
int N, M, i, a, b;
ifstream in( "arbint.in" );
in>>N>>M;
for( i=1; i <= N; ++i )
{
in>>a;
UpDate( 1, 1, N, a, i );
}
ofstream out( "arbint.out" );
for( ; M; --M )
{
in>>i>>a>>b;
switch( i )
{
case 0 : out<<Query( 1, 1, N, a, b )<<'\n'; break;
case 1 : UpDate( 1, 1, N, b, a );
}
}
return EXIT_SUCCESS;
}