#include <cstdio>
using namespace std;
#define Input "arbint.in"
#define Output "arbint.out"
#define NMAX 1<<16+5
int arb[NMAX],pos,val,middle,maxim,start,final;
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void update(int node,int left,int right)
{
if(left==right)
{
arb[node]=val;
return;
}
middle=(left+right)/2;
if(pos<=middle)
update(2*node,left,middle);
else
update(2*node+1,middle+1,right);
arb[node]=max(arb[2*node],arb[2*node+1]);
}
void query(int node,int left,int right)
{
if(start<=left && right<=final)
{
if(maxim<arb[node])
maxim=arb[node];
return;
}
middle=(right+left)/2;
if(start<=middle)
query(2*node,left,middle);
if(middle<final)
query(2*node+1,middle+1,right);
}
/*
void Update(int nod, int left, int right)
{
if ( left == right )
{
MaxArb[nod] = Val;
return;
}
int div = (left+right)/2;
if ( Pos <= div ) Update(2*nod,left,div);
else Update(2*nod+1,div+1,right);
MaxArb[nod] = Maxim( MaxArb[2*nod], MaxArb[2*nod+1] );
}
void Query(int nod, int left, int right)
{
if ( start <= left && right <= finish )
{
if ( maxim < MaxArb[nod] ) maxim = MaxArb[nod];
return;
}
int div = (left+right)/2;
if ( start <= div ) Query(2*nod,left,div);
if ( div < finish ) Query(2*nod+1,div+1,right);
}
*/
int main()
{
int n,m,i,type,v1,v2;
freopen (Input,"r",stdin);
freopen (Output,"w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&val);
pos=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&type,&v1,&v2);
if(type==0)
{
start=v1;
final=v2;
maxim=0;
query(1,1,n);
printf("%d\n",maxim);
}
else
{
pos=v1;
val=v2;
update(1,1,n);
}
}
}