#include<stdio.h>
long left,right,max,m,n,poz,val,v[1<<18];
inline long Max(long a,long b) {return a>b?a:b;}
void update(int nod,int st,int dr)
{
if (st==dr)
{
v[st]=val;
return;
}
int mij=(st+dr)>>1;
if (poz<=mij)
update(nod<<1,st,mij);
else
update((nod<<1)+1,mij+1,dr);
v[nod]=Max(v[nod<<1],v[(nod<<1)+1]);
}
void query(int nod,int st,int dr)
{
if(left<=st && dr<=right)
{
if(max<v[nod])
max=v[nod];
return;
}
int mij=(st+dr)>>1;
if (left<=mij)
query(nod<<1,st,mij);
if (mij<right)
query((nod<<1)+1,mij+1,right);
}
int main()
{
long i,temp,x,y,stare;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld%ld",&n,&m);
for (i=1;i<=n;++i)
{
scanf("%ld",&temp);
poz=i;
val=temp;
update(1,1,n);
}
for (i=1;i<=m;++i)
{
scanf("%ld%ld%ld",&stare,&x,&y);
if (stare)
{
poz=x;
val=y;
update(1,1,n);
}
else
{
max=-1;
left=x;
right=y;
query(1,1,n);
printf("%ld\n",max);
}
}
return 0;
}