#include <fstream>
#include <cstdlib>
#define N_MAX 1<<18
using namespace std;
int Aint[N_MAX];
inline int _max( int x, int y ) { return x >= y ? x : y; }
inline void Update( int vertex, int left, int right, int& xIndex, int& xValue )
{
if( left == right )
{
Aint[vertex]=xValue;
return ;
}
int middle=(left+right)>>1;
if( xIndex <= middle )
Update( vertex<<1, left, middle, xIndex, xValue );
else Update( (vertex<<1)|1, middle+1, right, xIndex, xValue );
Aint[vertex]=_max( Aint[vertex<<1], Aint[(vertex<<1)|1] );
}
inline int Query( int vertex, int left, int right, int& Left, int& Right )
{
if( left >= Left && right <= Right )
return Aint[vertex];
int middle=(left+right)>>1, m1=0, m2=0;
if( Left <= middle )
m1=Query( vertex<<1, left, middle, Left, Right );
if( Right > middle )
m2=Query( (vertex<<1)|1, middle+1, right, Left, Right );
return _max( m1, m2 );
}
int main( void )
{
int N, M, op, i, j;
ifstream in( "arbint.in" );
in>>N>>M;
for( i=1; i <= N; ++i )
{
in>>j;
Update( 1, 1, N, i, j );
}
ofstream out( "arbint.out" );
for( ; M; --M )
{
in>>op>>i>>j;
switch(op)
{
case 0 : out<<Query( 1, 1, N, i, j )<<'\n'; break;
case 1 : Update( 1, 1, N, i, j ); break;
}
}
return EXIT_SUCCESS;
}