#include <fstream>
using namespace std;
ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );
const int NMAX = 100002;
int N, Q;
int tree[ ( 1 << 18 ) ];
void Update( int nod, int lf, int rg, int val, int pos )
{
if( lf == rg )
{
tree[nod] = val;
return;
}
int mid = ( lf + rg ) / 2;
if( pos <= mid ) Update( nod * 2, lf, mid, val, pos );
if( pos > mid ) Update( nod * 2 + 1, mid + 1, rg, val, pos );
tree[nod] = max( tree[nod * 2], tree[nod * 2 + 1] );
}
int Query( int nod, int lf, int rg, int L, int R )
{
if( L <= lf && rg <= R ) return tree[nod];
int mid = ( lf + rg ) / 2;
int q1, q2;
if( L <= mid ) q1 = Query( nod * 2, lf, mid, L, R );
else q1 = -1;
if( R > mid ) q2 = Query( nod * 2 + 1, mid + 1, rg, L, R );
else q2 = -1;
return max( q1, q2 );
}
void Read()
{
fin >> N >> Q;
int aux;
for( int i = 1; i <= N; ++i )
{
fin >> aux;
Update( 1, 1, N, aux, i );
}
int tip, a, b;
for( int i = 1; i <= Q; ++i )
{
fin >> tip >> a >> b;
if( tip == 0 ) fout << Query( 1, 1, N, a, b ) << '\n';
else
{
Update( 1, 1, N, b, a );
}
}
//for( int i = 1; i <= N; ++i )
// fout << tree[i] << ' ';
fin.close();
fout.close();
}
int main()
{
Read();
return 0;
}