#include <bits/stdc++.h>
using namespace std;
int arb[400005], tip, q, a, b, ans, n;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
void update ( int nod, int st, int dr, int poz, int val )
{
int mij = (st+dr)/2;
if ( st == dr )
{
arb[nod] = val;
return;
}
if ( poz <= mij )
{
update( 2 * nod , st, mij , poz , val );
}
else
{
update( 2 * nod + 1 , mij + 1 , dr, poz , val );
}
arb[nod] = max ( arb[2*nod], arb[2*nod+1] );
}
void queri ( int nod, int st, int dr, int L, int R )
{
if ( dr < L || st > R )
{
return;
}
if ( st >= L && dr <= R )
{
ans = max ( ans, arb[nod] );
return;
}
int mij = (st+dr)/2;
queri( 2*nod, st, mij, L, R );
queri( 2*nod+1 , mij + 1, dr, L , R );
}
int main ()
{
f>>n>>q;
for ( int i = 1; i <= n ; i++ )
{
f>>a;
update( 1, 1 , n , i , a );
}
for ( int i = 1; i <= q ; i++ )
{
f>>tip>>a>>b;
if ( tip )
{
update( 1 , 1 , n , a , b );
}
else
{
ans = 0;
queri ( 1, 1 , n , a, b );
g<<ans<<'\n';
}
}
return 0;
}