#include <stdio.h>
#include <stdlib.h>
#define Nmax 100001
int v[ Nmax * 4 + 100 ], n, m, a, b, maxi, val, pos;
int max( int x1, int x2 )
{
return x1 > x2 ? x1 : x2;
}
void Update( int node, int left, int right )
{
if ( left == right )
{
v[ node ] = val;
return;
}
int mid = (right + left) / 2;
if ( pos <= mid )
Update( 2 * node, left, mid );
else
Update( 2 * node + 1, mid + 1, right );
v[ node ] = max(v[ node * 2 + 1 ], v[ node * 2 ]);
}
void Query( int node, int left, int right )
{
if ( a <= left && right <= b )
{
if ( maxi < v[ node ] )
maxi = v[ node ];
return;
}
int mid = (right + left) / 2;
if ( a <= mid )Query( 2 * node, left, mid );
if ( mid < b )Query( 2 * node + 1, mid + 1, right );
}
int main()
{
int i = 1, x, mod;
FILE * f = fopen( "arbint.in", "r" );
FILE * g = fopen( "arbint.out", "w" );
fscanf( f, "%d%d", &n, &m );
while ( i <= n )
{
fscanf( f, "%d", &x );
pos = i;
val = x;
Update( 1, 1, n );
i ++;
}
i = 1;
while ( i <= m )
{
fscanf( f, "%d%d%d", &mod, &a, &b );
if ( mod == 1 )
{
pos = a;
val = b;
Update( 1, 1, n );
}
else
{
maxi = -1;
Query( 1, 1, n );
fprintf( g, "%d\n", maxi );
}
i++;
}
fclose( f );
fclose( g );
return 0;
}