#include <fstream>
using namespace std;
#define in "arbint.in"
#define out "arbint.out"
#define maxim(a,b) ((a)>(b)?(a):(b))
const int INF = (1<<30);
const int NMAX = 400005;
int A[NMAX], N, M, POS, VALUE, VAL_MAX;
void Update( int nod, int left, int right )
{
if ( left == right )
{
A[nod] = VALUE;
return;
}
int div = (left+((right-left)>>1));
if ( POS <= div ) Update ( 2*nod, left, div );
else Update ( 2*nod+1, div+1,right );
A[nod] = maxim ( A[2*nod], A[2*nod+1] );
}
void Query( int nod, int left, int right, int START, int FINAL )
{
if ( START <= left && right <= FINAL )
{
VAL_MAX = maxim( VAL_MAX, A[nod] );
return;
}
int div = (left + ((right-left)>>1));
if ( START <= div ) Query ( 2*nod, left, div, START, FINAL );
if ( FINAL > div ) Query ( 2*nod+1, div+1, right, START, FINAL );
}
int main(void)
{
freopen ( in, "r", stdin );
freopen ( out, "w", stdout );
scanf ( "%d%d", &N, &M );
int i, OP, START, FINAL;
for ( i = 1; i <= N; ++i )
{
POS = i;
scanf ( "%d", &VALUE );
Update( 1, 1, N );
}
for ( ; M; --M )
{
scanf ( "%d%d%d", &OP, &POS, &VALUE );
if ( OP ) Update ( 1, 1, N );
else {
START = POS, FINAL = VALUE, VAL_MAX = -INF;
Query(1,1,N,START,FINAL);
printf ( "%d\n", VAL_MAX );
}
}
return 0;
}