/*
* File: main.cpp
* Author: virtualdemon
*
* Created on January 29, 2010, 10:02 AM
*/
#include <fstream>
/*
*
*/
using namespace std;
int *v;
inline int max( int x, int y )
{
return x^( (x^y) & -(x<y) );
}
inline void Update( int vertex, int left, int right, int p, int x )
{
if( left == right )
{
v[vertex]=x;
return;
}
int middle=left+( right-left )/2;
if( p <= middle )
Update( 2*vertex, left, middle, p, x );
else Update( 2*vertex+1, middle+1, right, p, x );
v[vertex]=max( v[2*vertex], v[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int a, int b )
{
if( a <= left && right <= b )
return v[vertex];
int max1=-1, max2=-1, middle=left+( right-left )/2;
if( a <= middle )
max1=Query( 2*vertex, left, middle, a, b );
if( b > middle )
max2=Query( 2*vertex+1, middle+1, right, a, b );
return max( max1, max2 );
}
int main()
{int N, m, i, x, y, z;
ifstream in("arbint.in");
in>>N>>m;
v=new int[4*N+1];
for( i=1; i <= N; ++i )
{
in>>x;
Update( 1, 1, N, i, x );
}
ofstream out("arbint.out");
for( i=1; i <= m; ++i )
{
in>>x>>y>>z;
if( 0 == x )
out<<Query( 1, 1, N, y, z )<<'\n';
else Update( 1, 1, N, y, z );
}
return 0;
}