#include <stdio.h>
long max[400002],m,n,a,b,x,pos,val,mx;
void up(long nod,long l,long r)
{
if (l==r)
{
max[nod]=val;
return;
}
long d=(l+r)/2;
if (pos<=d)
up(2*nod,l,d);
else
up(2*nod+1,d+1,r);
max[nod]=max[2*nod]>max[2*nod+1] ? max[2*nod] : max[2*nod+1];
}
void q(long nod,long l,long r)
{
if (a<=l&&r<=b)
{
if (mx<max[nod])
mx=max[nod];
return;
}
long d=(l+r)/2;
if (a<=d)
q(2*nod,l,d);
if (d<b)
q(2*nod+1,d+1,r);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld %ld",&n,&m);
long i;
for (i=1;i<=n;i++)
{
scanf("%ld",&a);
pos=i;
val=a;
up(1,1,n);
}
for (i=0;i<m;i++)
{
scanf("%ld %ld %ld",&x,&a,&b);
if (x)
{
pos=a;
val=b;
up(1,1,n);
}
else
{
mx=-1;
q(1,1,n);
printf("%ld\n",mx);
}
}
return 0;
}