#include <iostream>
#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 )
{
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 )
{
int mij = ( st + dr ) / 2;
if ( st >= L && dr <= R )
{
ans = max ( ans , arb[nod] );
return;
}
if ( st > R || dr < L )
{
return;
}
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;
}