#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100001;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, Q;
int tree[4 * NMAX ];
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 x;
fin >> N >> Q;
for( int i = 1; i <= N; ++i )
{
fin >> x;
Update(1, 1, N, i, x );
}
for( int i = 1; i <= Q; ++i )
{
int a, b;
fin >> x >> a >> b;
if( x == 0 )
{
fout << Query( 1, 1, N, a, b ) << '\n';
}
else Update( 1, 1, N, a, b );
}
}
int main()
{
Read();
return 0;
}