#include <fstream>
#define N 1000005
using namespace std;
ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );
int n, m;
int tree[4*N];
void update( int nod, int lf, int rg, int pos, int val )
{
if ( lf == rg )
{
tree[nod] = val;
return;
}
int mid = lf + ( rg - lf ) / 2;
if ( pos <= mid ) update( nod * 2, lf, mid, pos, val );
else update( nod * 2 + 1, mid + 1, rg, pos, val );
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 - lf ) / 2;
int maxi = -1;
if ( L <= mid ) maxi = max( maxi, query( nod * 2, lf, mid, L, R ) );
if ( mid < R ) maxi = max( maxi, query( nod * 2 + 1, mid + 1, rg, L, R ) );
return maxi;
}
void read()
{
int i, tip, a, b;
fin >> n >> m;
for ( i = 1; i <= n; ++i )
{
fin >> a;
update( 1, 1, n, i, a );
}
for ( i = 1; i <= m; ++i )
{
fin >> tip >> a >> b;
if ( tip == 0 ) fout << query( 1, 1, n, a, b ) << '\n';
else update( 1, 1, n, a, b );
}
}
int main()
{
read();
fout.close();
return 0;
}