#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TREE_MAX 1 << 17
#define NMAX 100001
#define FIN "arbint.in"
#define FOUT "arbint.out"
#define INFINIT -2000000000
int TREE[TREE_MAX], V[NMAX], ind, tip, value, M, N, ans, x, y;
FILE * fin, * fout;
int MAX( int a, int b )
{
return a > b ? a : b;
}
void build( int nod, int left, int right )
{
int half;
if( left == right )
TREE[nod] = V[left];
else
{
half = ( left + right ) >> 1;
build( 2 * nod, left, half );
build( 2* nod + 1, half + 1, right );
TREE[nod] = MAX( TREE[2*nod], TREE[2*nod+1]);
}
}
void query( int nod, int left, int right )
{
int half;
if ( x <= left && y >= right )
ans = MAX( ans, TREE[nod] );
else
{
half = ( left + right ) >> 1;
if ( x <= half )
query( 2 * nod, left, half );
else
if ( y > half )
query( 2 * nod + 1, half + 1, right );
}
}
void update( int nod, int left, int right )
{
int half;
if ( left == right )
TREE[nod] = V[left];
else
{
half = ( left + right ) >> 1;
if ( ind <= half )
update( 2 * nod, left, half );
else
update( 2 * nod + 1, half + 1, right );
TREE[nod] = MAX( TREE[2*nod], TREE[2*nod+1]);
}
}
int main()
{
fin = fopen( FIN, "r" );
fout = fopen( FOUT, "w" );
fscanf( fin, "%d%d", &N, &M);
for( int i = 1; i <= N; i++ )
fscanf( fin, "%d", V+i );
build( 1, 1, N );
while( M )
{
fscanf( fin, "%d%d%d", &tip, &ind, &value );
if( !tip )
{
x = ind; y = value; ans = INFINIT;
query( 1, 1, N );
fprintf( fout, "%d\n", ans);
}
else
{
V[ind] = value;
update( 1, 1, N);
}
M--;
}
fclose( fin );
fclose( fout );
return 0;
}