#include <stdio.h>
#define max(a,b) (a>b ? a : b )
int n,m,maxi,s,f,t[5000],i,j,poz,a,b,x,val;
void update(int,int,int);
void query(int,int,int);
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",&x);poz=i;val=x;update(1,1,n);}
for(i=1;i<=m;++i)
{
scanf("%d %d %d",&x,&a,&b);
if(x==0){
maxi=-1;
s=a;f=b;
query(1,1,n);
printf("%d\n",maxi);
}
else{
poz=a;val=b;
update(1,1,n);
}
}
return 0;
}
void update(int nod,int l, int r)
{
if (l==r)
{
t[nod]=val;
return;
}
int m=(l+r)/2;
if(poz<=m)update(2*nod,l,m);
else update(2*nod+1,m+1,r);
t[nod]=max(t[2*nod],t[2*nod+1]);
}
void query(int nod,int l,int r)
{
if (s<=l&&r<=f){
if(maxi<t[nod])maxi=t[nod];
return;
}
int m=(l+r)/2;
if(s<=m)query(2*nod,l,m);
if(m<f)query(2*nod+1,m+1,r);
}