#include <fstream>
using namespace std;
ifstream f ( "arbint.in" );
ofstream g ( "arbint.out" );
int n, m, arb [ 4 * 100005 ], ans, x, a, b, i;
void update ( int nod, int st, int dr, int poz, int val )
{
if ( st == dr )
{
arb[nod] = val;
return;
}
int mij = ( st + dr ) / 2;
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 ( st >= L && dr <= R )
{
ans = max ( ans, arb[nod] );
return;
}
if ( st < L || dr > R )
{
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>>m;
for (i=1; i<=n; i++)
{
f>>x;
update ( 1 , 1, n, i, x);
}
for ( i = 1 ; i <= m ; i++ )
{
f>>x>>a>>b;
if ( x == 1 )
{
update ( 1 , 1 , n , a , b );
}
else
{
ans=-1;
queri ( 1 , 1 , n , a , b );
g<<ans<<'\n';
}
}
return 0;
}