#include<stdio.h>
#define Nmax 100010
#define Max(a,b) a>b?a:b
int Arb[2*Nmax],i,n,m,op,p,u,maxim,poz,val;
void update (int nod, int s, int d)
{
if(s==d)
{
Arb[nod]=val;
return;
}
int m=(s+d)>>1;
if(poz <= m) update(2*nod,s,m);
else update(2*nod+1,m+1,d);
Arb[nod]=Max(Arb[2*nod],Arb[2*nod+1]);
}
void query (int nod, int s, int d)
{
if( p <= s && d <= u )
{
if( maxim < Arb[nod] )
maxim = Arb[nod];
return;
}
int m=(s+d)>>1;
if(p <= m) query(2*nod,s,m);
if(m < u) query(2*nod+1,m+1,d);
}
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",&val);
poz=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&op,&p,&u);
if(!op)
{
maxim=-1;
query(1,1,n);
printf("%d\n",maxim);
}
else
{
val=u; poz=p;
update(1,1,n);
}
}
return 0;
}