#include<stdio.h>
#define MAX(a,b) ((a)>(b) ? (a):(b))
int x,n,m,i,val,arb[500000],pos,max1,a,b,start,finish;
void up(int nod, int st, int dr)
{
if(st==dr)
{
arb[nod]=val;
return;
}
int mid=(st+dr)/2;
if(pos<=mid)
up(2*nod,st,mid);
else
up(2*nod+1,mid+1,dr);
arb[nod]=MAX(arb[nod*2],arb[nod*2+1]);
}
void cauta(int nod, int st, int dr)
{
if(start<=st && dr<=finish)
{
if(max1<arb[nod])
max1=arb[nod];
return;
}
int mij=(st+dr)/2;
if(start<=mij)
cauta(2*nod,st,mij);
if(mij<finish)
cauta(2*nod+1,mij+1,dr);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
pos=i;
val=x;
up(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&a,&b);
if(!x)
{
max1=-1;
start=a;
finish=b;
cauta(1,1,n);
printf("%d\n",max1);
}
else
{
val=b;
pos=a;
up(1,1,n);
}
}
return 0;
}