#include<stdio.h>
int v[600002],nr,c,sol,s1,s2;
int maxim(int a,int b)
{
if(a>=b)
return a;
return b;
}
void update(int a,int b,int nod)
{
int d;
if(a==b)
{
v[nod]=c;
return;
}
d=(a+b)/2;
if(nr<=d)
update(a,d,2*nod);
else
update(d+1,b,2*nod+1);
v[nod]=maxim(v[2*nod],v[2*nod+1]);
}
void query(int a,int b,int nod)
{
int d;
if(s1<=a&&b<=s2)
{
if(sol<v[nod])
sol=v[nod];
return;
}
d=(a+b)/2;
if(s1<=d)
query(a,d,2*nod);
if(d<s2)
query(d+1,b,2*nod+1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m,i,a,b,mod;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&c);
nr=i;
update(1,n,1);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&mod,&a,&b);
if(mod==1)
{
nr=a;
c=b;
update(1,n,1);
}
else
{
sol=-1;
s1=a;s2=b;
query(1,n,1);
printf("%d\n",sol);
}
}
return 0;
}