#include<stdio.h>
#define DIM 300000
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");
int N, M, Arb[DIM], a, b;
int Maxim( int Q, int W ){ if( Q > W ) return Q; return W; }
void Update( int poz, int val ){
int i, j, st, dr, mij, pozArb, Max;
st = 1; dr = N; pozArb = 1;
while( st != dr ){
mij = ( st + dr ) / 2;
if( poz <= mij ){
dr = mij;
pozArb = pozArb * 2;
}
else{
st = mij + 1;
pozArb = pozArb * 2 + 1;
}
}
Arb[ pozArb ] = val;
pozArb /= 2;
while( pozArb >= 1 ){
Arb[ pozArb ] = Maxim( Arb[ pozArb * 2 ], Arb[ pozArb * 2 + 1 ] );
pozArb /= 2;
}
}
int Query( int k1, int k2, int pozArb ){ // [a,b] - cel citit, [k1,k2] - cel momentan
int mij, R1 = 0, R2 = 0;
if( a <= k1 && k2 <= b ) // E inclus
return Arb[ pozArb ];
mij = ( k1 + k2 ) / 2;
if( a <= mij ) // Ma duc in stanga
R1 = Query( k1, mij, pozArb * 2 );
if( b >= mij+1 ) // Ma duc in dreapta
R2 = Query( mij+1, k2, pozArb * 2 + 1 );
return Maxim( R1, R2 );
}
void Citire(){
int i, x;
fscanf(f,"%d %d\n",&N,&M);
for(i=1;i<=N;i++){
fscanf(f,"%d",&x);
Update(i,x);
}
for(i=1;i<=M;i++){
fscanf(f,"%d %d %d\n",&x,&a,&b);
if( x == 0 )
fprintf(g,"%d\n", Query( 1, N, 1 ) );
else
Update( a, b );
}
}
int main(){
Citire();
return 0;
}