#include<fstream>
#include<cstdio>
using namespace std;
const int MaxN = 110001;
int n,m,st,dr,max1,val,poz,Arb[MaxN];
int maxim(int a,int b)
{
if( a > b )
return a;
return b;
}
void update(int nod,int left,int right)
{
if( left == right )
{
Arb[nod] = val;
return ;
}
int midd = (left+right)>>1;
if( poz <= midd )
update(2*nod,left,midd);
else
update(2*nod+1,midd+1,right);
Arb[nod] = maxim(Arb[2*nod],Arb[2*nod+1]);
}
void query(int nod , int left,int right )
{
if( st <= left && right <= dr )
{
max1 = maxim(max1,Arb[nod]);
return ;
}
int midd = (left+right)>>1;
if( st <= midd )
query(2*nod,left,midd);
if( midd < dr )
query(2*nod+1,midd+1,right);
}
int main()
{
freopen("arbint.in" , "r" , stdin);
freopen("arbint.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
int i,x;
for( i = 1 ; i <= n ; i++ )
{
scanf("%d" , &x );
poz = i;
val = x;
update(1,1,n);
}
int op,a,b;
for( i = 1 ; i <= m ; i++ )
{
scanf("%d%d%d" , &op , &a, &b );
if( !op )
{
st = a;
dr = b;
max1 = -1;
query(1,1,n);
printf("%d\n" , max1 );
}
else
{
poz = a;
val = b;
update(1,1,n);
}
}
return 0;
}