#include <cstdio>
#define MaxN 100099
#define fs(x) (2*(x))
#define fd(x) (2*(x)+1)
long long arb[4*MaxN],n,m,a,b,pos,val,op,max,i;
long long maxim(long long a,long long b)
{
if(a>b)
return a;
return b;
}
void update(long long nod,long long st,long long dr)
{
long long div;
if(st==dr)
{
arb[nod]=val;
return;
}
div=(st+dr)/2;
if(div>=pos)
update(fs(nod),st,div);
else
update(fd(nod),div+1,dr);
arb[nod]=maxim(arb[fs(nod)],arb[fd(nod)]);
}
void query(long long nod,long long st,long long dr)
{
if(st>=a && dr<=b)
{
if(max<arb[nod])
max=arb[nod];
return;
}
long long div=(st+dr)/2;
if(a<=div)
query(fs(nod),st,div);
if(div<b)
query(fd(nod),div+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",&val);
pos=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d",&op);
if(!op)
{
scanf("%d%d",&a,&b);
max=-1;
query(1,1,n);
printf("%d\n",max);
}
else
{
scanf("%d%d",&pos,&val);
update(1,1,n);
}
}
return 0;
}