#include<stdio.h>
int n,m,max;
int p,x,pr,ul;
int v[400075];
inline int maxim(int a, int b)
{
if(a>b)
return a;
return b;
}
void update(int nod, int st, int dr)
{
if(st==dr)
{
v[nod]=x;
return;
}
int m=(st+dr)>>1;
if(p<=m)
update(nod*2,st,m);
else
update(nod*2+1,m+1,dr);
v[nod]=maxim(v[nod*2],v[nod*2+1]);
}
void query(int nod, int st, int dr)
{
if(pr<=st && dr<=ul)
{
if(max<v[nod])
max=v[nod];
return;
}
int m=(st+dr)>>1;
if(pr<=m)
query(nod*2,st,m);
if(m<ul)
query(nod*2+1,m+1,dr);
}
void read()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
p=i;
update(1,1,n);
}
int t,a,b;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&a,&b);
if(t==0)
{
max=0;
pr=a;ul=b;
query(1,1,n);
printf("%d\n",max);
}
else
{
p=a;x=b;
update(1,1,n);
}
}
}
int main()
{
read();
return 0;
}