#include <fstream>
#include <cstdlib>
#define N_MAX 400011
using namespace std;
int v[N_MAX];
inline int _max( int x, int y ) { return x >= y ? x : y; }
inline void Update( int vertex, int left, int right, const int& xIndex, const int& xValue )
{
if( left == right )
{
v[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 );
v[vertex]=_max( v[vertex<<1], v[(vertex<<1)|1] );
}
inline int Query( int vertex, int left, int right, const int& a, const int& b )
{
if( left >= a && right <= b )
return v[vertex];
int middle=(left+right)>>1, m1=-1, m2=-1;
if( a <= middle )
m1=Query( vertex<<1, left, middle, a, b );
if( b > middle )
m2=Query( (vertex<<1)|1, middle+1, right, a, b );
return _max( m1, m2 );
}
int main( void )
{
int N, M, i, x, a, b, op;
ifstream in( "arbint.in" );
in>>N>>M;
for( i=1; i <= N; ++i )
{
in>>x;
Update( 1, 1, N, i, x );
}
for( ofstream out( "arbint.out" ); M; --M )
{
in>>op>>a>>b;
if( 0 == op )
out<<Query( 1, 1, N, a, b )<<'\n';
else Update( 1, 1, N, a, b );
}
return EXIT_SUCCESS;
}