#include<stdio.h>
#include<algorithm>
#define DIM 100005
FILE *f=fopen("arbint.in","r"), *g=fopen("arbint.out","w");
using namespace std;
int N, Q, Arb[3*DIM], x, tip, A, B;
void Update( int poz, int val ){
int mij, i, k1, k2;
k1 = 1;
k2 = N;
i = 1; // poz in Arb
while( k1 < k2 ){
mij = ( k1 + k2 ) / 2;
if( poz <= mij ){
i = i * 2;
k2 = mij;
}
else{
i = i * 2 + 1;
k1 = mij + 1;
}
} if( k1 != k2 ) printf("EROARE FATALA!!");
Arb[i] = val;
while( i > 1 ){
Arb[i/2] = max( Arb[(i/2)*2], Arb[(i/2)*2+1] );
i /= 2;
}
}
int Query( int k1, int k2, int iArb ){ // [k1,k2] intervalul momentan
int mij, ST, DR; // iArb = poz in Arb
if( A <= k1 && k2 <= B )
return Arb[iArb];
if( !(k2 < A || k1 > B) ){
mij = ( k1 + k2 ) / 2;
ST = Query( k1, mij, iArb*2 );
DR = Query( mij+1, k2, iArb*2+1 );
return max(ST,DR);
}
else
return 0; // Un numar care nu modifica maximul
}
int main(){
fscanf(f,"%d %d\n",&N,&Q);
for(int i=1;i<=N;i++){
fscanf(f,"%d",&x);
Update(i,x);
}
for(int q=1;q<=Q;q++){
fscanf(f,"%d %d %d\n",&tip,&A,&B);
if( tip == 1 )
Update(A,B);
else
fprintf(g,"%d\n",Query(1,N,1));
}
return 0;
}