//arbore de intervale
#include<cstdio>
int I[600000];
int N,M,valoare,pos,maxim,A,B,o,s,f;
FILE *in = fopen("arbint.in","r");
FILE *out = fopen("arbint.out","w");
int max( int x, int y ) { return (x > y ? x : y) ; }
void update( int nod, int start, int finish )
{
if( start == finish )
{
nod = valoare;
return;
}
int mid = (start+finish)/2;
if( pos <= mid ) update( 2 * nod, start, mid );
else update( 2 * nod + 1, mid+1,finish );
I[ nod ] = max( I[ 2*nod ] , I[ 2 * nod + 1] );
}
void query( int nod, int start, int finish )
{
if( s <= start && finish <= f )
{
if ( maxim < I[ nod ] ) maxim = I[ nod ];
return;
}
int mid = (start+finish)/2;
if( s <= mid ) query ( 2*nod, start, mid );
if( mid > f) query ( 2*nod + 1, mid+1, finish );
}
int main()
{
fscanf(in,"%d %d",&N,&M);
for( int i=1; i<=N;++i)
{
fscanf( in,"%d",&valoare);
pos = i;
update( 1, 1,N );
}
for( int i = 1; i<= M; ++i )
{
fscanf(in,"%d %d %d",&o,&A,&B);
if( o )
{
s = A;
f = B;
maxim = -1;
query( 1, 1, N );
fprintf(out,"%d\n",maxim);
}
else
{
pos = A;
valoare = B;
update( 1,1,N );
}
}
return 0;
}