#include <iostream>
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream fin("aint.in");
ofstream fout("aint.out");
int tree[4*NMAX];
int v[NMAX];
int N, Q, op, x, y;
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 ans1,ans2;
ans1 = ans2 = 0;
if( L <= mid ) ans1 = Query( nod*2, lf, mid, L, R );
if( mid < R ) ans2 = Query( nod*2+1, mid+1, rg, L, R);
return max(ans1, ans2 );
}
void Solve()
{
fin >> N >> Q;
for( int i = 1; i <= N; ++i )
{
fin >> v[i];
Update( 1, 1, N, i, v[i] );
}
for( int q = 1; q <= Q; ++q )
{
fin >> op >> x >> y;
if( op == 0 )
{
fout << Query( 1, 1, N, x, y ) << '\n';
}
else
{
Update( 1, 1, N, x, y );
}
}
}
int main()
{
Solve();
return 0;
}