#include <bits/stdc++.h>
#define MAXN 100000
using namespace std;
ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );
int v[MAXN + 1];
int aint[4 * MAXN + 1];
void build( int node, int left, int right ){
if( left == right ){
aint[node] = v[left];
return;
}
int mij = ( left + right ) / 2;
build( 2 * node, left, mij );
build( 2 * node + 1, mij + 1, right );
aint[node] = max( aint[2 * node], aint[2 * node + 1] );
}
void update( int node, int left, int right, int poz, int val ){
if( left == right ){
aint[node] = val;
return;
}
int mij = ( left + right ) / 2;
if( poz <= mij )
update( 2 * node, left, mij, poz, val );
else
update( 2 * node + 1, mij + 1, right, poz, val );
aint[node] = max( aint[2 * node], aint[2 * node + 1] );
}
int query( int node, int left, int right, int qleft, int qright ){
int maxim = -1;
if( qleft <= left && right <= qright )
return aint[node];
int mij = ( left + right ) / 2;
if( qleft <= mij )
maxim = max( maxim, query( 2 * node, left, mij, qleft, qright ));
if( mij < qright )
maxim = max( maxim, query( 2 * node + 1, mij + 1, right, qleft, qright ));
return maxim;
}
int main(){
int n, q, i, c, poz, val, qst, qdr;
fin >> n >> q;
for( i = 1; i <= n; i++ )
fin >> v[i];
build( 1, 1, n );
for( i = 1; i <= q; i++ ){
fin >> c;
if( c == 1 ){
fin >> poz >> val;
update( 1, 1, n, poz, val );
}
else{
fin >> qst >> qdr;
fout << query( 1, 1, n, qst, qdr ) << '\n';
}
}
}