#include<stdio.h>
using namespace std;
#define dim 100001
int maxim, start, finish, MaxArb[ 4 * dim ];
inline int Maxim ( int a, int b )
{
if ( a > b ) return a;
return b;
}
void Update ( int nod, int left, int right, int Pos, int x )
{
if ( left == right )
{
MaxArb[nod] = x;
return ;
}
int mij = ( left + right ) / 2;
if ( Pos <= mij )
Update( 2 * nod, left, mij, Pos, x);
else
Update( 2 * nod + 1, mij + 1, right, Pos, x);
MaxArb[ nod ] = Maxim( MaxArb[ 2 * nod ], MaxArb[ 2 * nod + 1 ] );
}
void Query ( int nod, int left, int right )
{
if ( start <= left && right <= finish )
{
if ( maxim < MaxArb[ nod ] )
maxim = MaxArb[ nod ];
return ;
}
int mij = ( left + right ) / 2;
if ( start <= mij )
Query(2 * nod, left, mij);
if ( mij < finish )
Query(2 * nod +1, mij + 1, right);
}
int main ()
{
int i, x, t, a, b, N, M;
FILE *f = fopen ( "arbint.in","r" ), *g = fopen ( "arbint.out","w" );
fscanf( f,"%d %d", &N, &M );
for ( i = 1; i <= N; ++i )
{
fscanf ( f,"%d", &x );
Update ( 1, 1, N, i,x );
}
for ( i = 1; i <= M; ++i )
{
fscanf ( f,"%d %d %d", &t, &a, &b );
if ( t == 0 )
{
maxim = -1;
start = a;
finish = b;
Query ( 1, 1, N );
fprintf ( g,"%d\n", maxim);
}
else
Update ( 1, 1, N, a, b );
}
fclose ( f );
fclose ( g );
return 0;
}