#include <cstdio>
#define nmax 100005
using namespace std;
int a[4*nmax],n,m,poz,val,start,finish,maxim;
int mxm(int a,int b)
{
if(a>b)
return a;
return b;
}
void update(int nod,int st,int dr)
{
if(st==dr)
a[nod]=val;
else
{
int m=(st+dr)/2;
if(poz<=m)
update(2*nod,st,m);
else
update(2*nod+1,m+1,dr);
a[nod]=mxm(a[2*nod],a[2*nod+1]);
}
}
void get(int nod,int st,int dr)
{
if(start<=st&&dr<=finish)
{
if(maxim<a[nod])
maxim=a[nod];
}
else
{
int m=(st+dr)/2;
if(start<=m)
get(2*nod,st,m);
if(m<finish)
get(2*nod+1,m+1,dr);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int t,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
poz=i;
val=x;
update(1,1,n);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&x,&y);
if(t==0)
{
start=x;
finish=y;
maxim=-1;
get(1,1,n);
printf("%d\n",maxim);
}
else
{
val=y;
poz=x;
update(1,1,n);
}
}
return 0;
}