#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 100000;
int N,M;
int arb[4*NMAX+1], Ans_Q;
void Update( int nod, int st, int dr, int poz, int val ) {
if( st == dr ) { /// Am ajuns intr-o frunza
arb[nod]= val;
}
else { /// Vad unde ma duc
int mid= (st+dr)/2;
if( poz <= mid ) {
Update( 2*nod, st, mid, poz, val );
}
else {
Update( 2*nod+1, mid+1, dr, poz, val );
}
arb[ nod ]= max( arb[ 2*nod ], arb[ 2*nod+1 ] );
}
}
void Querry( int nod, int st, int dr, int x, int y ) {
int mid= (st+dr)/2;
if( st >= x && y >= dr ) {
Ans_Q= max( Ans_Q, arb[nod] );
return;
}
mid= (st+dr)/2;
if( x<=mid ) {
Querry( 2*nod, st, mid, x, y );
}
if( y>mid ) {
Querry( 2*nod+1, mid+1, dr, x, y );
}
}
int main() {
in >> N >> M;
for( int i= 1; i<=N; ++i ) {
int a;
in >> a;
Update( 1, 1,N, i, a );
}
for( int i= 1; i<=M; ++i ) {
int t,x,y;
in >> t >> x >> y;
if( t == 0 ) {
Ans_Q= 0;
Querry( 1, 1,N, x,y );
out << Ans_Q << '\n';
}
else {
Update( 1, 1,N, x, y );
}
}
return 0;
}