#include <fstream>
using namespace std;
int i,j,n,m,x,y,a,b,q,ans,arb[4*100010];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void upd( int nod, int left, int right, int poz, int val )
{
int middle = ( left + right ) / 2;
if( left == right )
{
arb[ nod ] = val;
return;
}
if( poz <= middle )
upd( 2 * nod , left , middle , poz , val );
else
upd( 2 * nod + 1 , middle + 1 , right , poz , val );
arb[ nod ] = max( arb[ 2 * nod ] , arb[ 2 * nod + 1 ] );
}
void query( int nod, int left, int right, int L, int R )
{
int middle = ( left + right ) / 2;
if( L <= left && right <= R )
{
ans = max( ans , arb[ nod ] );
return;
}
if( left > R || right < L )
{
return;
}
query( 2 * nod , left , middle , L , R );
query( 2 * nod + 1 , middle + 1 , right , L , R );
}
int main()
{
fin>>n>>m;
for( i = 1 ; i <= n ; i++ )
{
fin>>x;
upd( 1 , 1 , n , i , x );
}
for( i = 1 ; i <= m ; i++ )
{
fin>>q>>a>>b;
if( q == 1 )
{
upd( 1 , 1 , n , a , b );
}
else
{
ans = 0;
query( 1 , 1 , n , a , b );
fout<<ans<<'\n';
}
}
return 0;
}