#include <fstream>
using namespace std;
int Arb[400005],i,x,n,m,p,y;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void Update( int nod, int st, int dr, int poz, int val )
{
if( st == dr )
{
Arb[ nod ] = val;
return;
}
else
{
int mij = ( st + dr ) / 2;
if( poz <= mij )
{
Update( nod * 2, st ,mij, poz, val );
}
else
{
Update( nod * 2 + 1, mij + 1, dr, poz, val);
}
Arb[ nod ] = max( Arb[ nod * 2 ], Arb[ nod * 2 + 1 ] );
}
}
int Query( int nod, int st, int dr, int a, int b )
{
if( dr < a or st > b )
return 0;
if( st >= a and dr <= b )
{
return Arb[ nod ];
}
else
{
int mij = ( st + dr ) / 2;
return max( Query( nod * 2, st, mij, a, b), Query( nod * 2 + 1 , mij + 1, dr, a, b ) );
}
}
int main()
{
fin>>n>>m;
for( i = 1; i <= n; i++ )
{
fin>>x;
Update( 1 , 1, n, i , x );
}
for( i = 1; i <= m; i++ )
{
fin>>p>>x>>y;
if( p == 1 )
{
Update( 1 , 1 , n , x , y );
}
else
{
fout<<Query(1, 1, n, x ,y )<<'\n';
}
}
return 0;
}