#include <stdio.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
static inline int min( int a, int b ) {
return ( a <= b ? a : b );
}
static inline int max( int a, int b ) {
return ( a >= b ? a : b );
}
FILE *fin;
int poz, valBuff;
static char buff[ ( 1 << 7 ) ];
static inline char nextChar() {
if( poz == valBuff ) {
fread( buff, 1, valBuff, fin );
poz = 0;
}
return buff[ poz++ ];
}
static bool f[ 100 ];
static inline int readInt() {
int rez = 0;
int ch;
while( !f[ ch = nextChar() ] );
do
rez = rez * 10 + ch - '0';
while( f[ ch = nextChar() ] );
return rez;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int tree[ 400000 ];
int v[ 100010 ];
int n;
void makeTree( int poz, int left, int right ) {
if( left == right )
tree[ poz ] = v[ right ];
else {
int med = ( left + right ) >> 1;
int R = poz + 2 * ( med - left + 1 );
int L = poz + 1;
makeTree( L, left, med );
makeTree( R, med + 1, right );
tree[ poz ] = max( tree[ L ], tree[ R ] );
}
}
void update( int poz, int left, int right, int target, int val ) {
if( left == right )
tree[ poz ] = val;
else {
int med = ( left + right ) >> 1;
int R = poz + 2 * ( med - left + 1 );
int L = poz + 1;
if( target <= med )
update( L, left, med, target, val );
else update( R, med + 1, right, target, val );
tree[ poz ] = max( tree[ L ], tree[ R ] );
}
}
int query( int poz, int left, int right, int a, int b ) {
if( a <= left && right <= b )
return tree[ poz ];
int med = ( left + right ) >> 1;
int R = poz + 2 * ( med - left + 1 );
int L = poz + 1;
int ans = 0;
if( a <= med )
ans = query( L, left, med, a, b );
if( med < b )
ans = max( ans, query( R, med + 1, right, a, b ) );
return ans;
}
int main()
{
f[ '0' ] = f[ '1' ] = f[ '2' ] = f[ '3' ] = f[ '4' ] = 1;
f[ '6' ] = f[ '7' ] = f[ '8' ] = f[ '9' ] = f[ '5' ] = 1;
valBuff = sizeof( buff );
fin = fopen( "arbint.in", "r" );
fread( buff, 1, valBuff, fin );
n = readInt();
int q = readInt();
for( int i = 0; i < n; i++ )
v[ i ] = readInt();
makeTree( 0, 0, n - 1 );
int a, b, cerinta;
FILE *fout = fopen( "arbint.out", "w" );
while( q-- ) {
cerinta = readInt();
a = readInt();
b = readInt();
if( cerinta == 1 )
update( 0, 0, n - 1, a - 1, b );
else fprintf( fout, "%d\n", query( 0, 0, n - 1, a - 1, b - 1 ) );
}
fclose( fin );
fclose( fout );
return 0;
}