#include <fstream>
#define f in
#define g out
using namespace std;
ifstream in ( "arbint.in" );
ofstream out( "arbint.out" );
int aint[400000];
int n, m, i, maxim, op, x, y;
void build ( int nod, int st, int dr ){
if ( st == dr )
f>>aint[nod];
else {
int mid = (st+dr)/2;
build(2*nod, st, mid);
build(2*nod+1, mid+1, dr);
aint[nod] = max ( aint[2*nod], aint[2*nod+1] );
}
}
void update ( int nod, int st, int dr, int poz, int nr ){
if ( st == dr )
aint[nod] = nr;
else {
int mid = (st+dr)/2;
if ( poz <= mid )
update(2*nod, st, mid, poz, nr);
else update(2*nod+1, mid+1, dr, poz, nr);
aint[nod] = max ( aint[2*nod], aint[2*nod+1] );
}
}
void query ( int nod, int st, int dr, int x, int y ){
if ( x <= st && dr <= y )
maxim = max ( maxim, aint[nod] );
else {
int mid = (st+dr)/2;
if ( x <= mid )
query(2*nod, st, mid, x, y);
if ( y > mid )
query(2*nod+1, mid+1, dr, x, y);
}
}
int main() {
f>>n>>m;
build(1, 1, n);
for ( ; m--; ){
f>>op>>x>>y;
if ( !op ){
maxim = 0;
query(1,1,n,x,y);
g<<maxim<<"\n";
} else update(1,1,n,x,y);
}
return 0;
}