#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n , m , arb[9000];
int Maxim( int a , int b )
{
return ( a > b )? a : b;
}
void Creare( int Node , int Low , int High , int Pos , int Val )
{
if ( Low == High )
arb[Node] = Val;
else
{
int Mid = ( Low + High ) / 2;
if ( Pos <= Mid ) Creare( 2 * Node , Low , Mid , Pos , Val );
else Creare( 2 * Node + 1 , Mid + 1 , High , Pos , Val );
arb[Node] = Maxim( arb[2 * Node] , arb[2 * Node + 1] );
}
}
int Querry( int Node , int Low , int High , int qA , int qB )
{
int Mid , R1 = -1 , R2 = -1;
if ( qA <= Low && High <= qB )
return arb[Node];
Mid = ( Low + High ) / 2;
if ( qA <= Mid )
R1 = Querry( 2 * Node , Low , Mid , qA , qB );
if ( Mid < qB )
R2 = Querry( 2 * Node + 1 , Mid + 1 , High , qA , qB );
return Maxim( R1 , R2 );
}
void Read()
{
int cer , a1 , b1 , aux;
fin >> n >> m;
for ( int i = 1 ; i <= n ; ++i )
{
fin >> aux;
Creare( 1 , 1 , n , i , aux );
}
for ( int i = 1 ; i <= m ; ++i )
{
fin >> cer >> a1 >> b1;
if ( cer == 1 )
Creare( 1 , 1 , n , a1 , b1 );
else fout << Querry( 1 , 1 , n , a1 , b1 ) << '\n';
}
}
int main()
{
Read();
return 0;
}