#include <stdio.h>
#define N 1<<20
int n,m,x,poz;
int v[N],maxim,inc,sf;
inline int max(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 t=(st+dr)/2;
if (poz<=t)
update(nod*2,st,t);
else
update(nod*2+1,t+1,dr);
v[nod]=max(v[nod*2],v[nod*2+1]);
}
void query(int nod,int st,int dr)
{
if (inc<=st && dr<=sf)
{
if (maxim<v[nod])
maxim=v[nod];
return;
}
int t=(st+dr)/2;
if (inc<=t)
query(nod*2,st,t);
if (t<sf)
query(nod*2+1,m+1,dr);
}
int main()
{
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);
poz=i;
update(1,1,n);
}
int tip,a,b;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&tip,&a,&b);
if (tip==0)
{
maxim=0;
inc=a;
sf=b;
query(1,1,n);
printf("%d\n",maxim);
}
else
{
poz=a;
x=b;
update(1,1,n);
}
}
return 0;
}