# include "fstream"
using namespace std ;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAX = 4e5+12;
int arb [ MAX ] ;
void update (int nod , int st , int dr , int pos , int val)
{
if (st == dr)
{
arb [ nod ] = val ;
return ;
}
int mij = (st + dr)/2 ;
if (pos <= mij)
update (nod*2, st , mij , pos , val) ;
else
update (nod*2+1 , mij + 1 , dr , pos , val) ;
arb [nod] = max(arb [ nod * 2 ] , arb [ nod * 2 + 1 ]) ;
}
inline int query (int nod , int st , int dr , int a , int b)
{
if (a <= st and dr <= b)
return arb [nod] ;
int mij = (st + dr)/2,max1=0,max2=0;
if (a <= mij)
max1 = query (nod*2 , st , mij , a , b) ;
if (b > mij)
max2 = query (nod * 2 + 1 , mij + 1 , dr , a , b) ;
return max (max1 , max2) ;
}
int main()
{
int n , m ;
fin>> n >> m ;
for(int i=1;i<=n;i++)
{
int x ;
fin>> x ;
update (1 , 1 , n , i , x) ;
}
while ( m -- )
{
int tip ;
fin>> tip ;
if ( tip == 0 )
{
int a , b ;
fin>> a >> b ;
fout<< query ( 1 , 1 , n , a , b ) << "\n" ;
}
else {
int a , b ;
fin>> a >> b ;
update ( 1 , 1 , n , a , b ) ;
}
}
return 0;
}