#include<stdio.h>
#define max(a,b) ((a)>(b)?(a):(b))
int v[1000000],i,min,j,k,l,x,m,n,p,q,ok,a,b;
void upd(int p,int u,int poz,int nod,int val){
if(p==u){
v[nod]=val;return ;
}
int m=(p+u)>>1;
if(m>=poz)upd(p,m,poz,nod*2,val);
else
upd(m+1,u,poz,nod*2+1,val);
v[nod]=max(v[2*nod],v[2*nod+1]);
}
int querry(int p,int u,int a,int b,int nod){
if(a<=p&&b>=u)return v[nod];
else
if(u<a)return -1;
else
if(p>b)return -1;
int x=-1,y=-1,m;
m=(p+u)>>1;
if(p<=m)x=querry(p,m,a,b,2*nod);
if(m<u)y=querry(m+1,u,a,b,2*nod+1);
return max(x,y);
}
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);
upd(1,n,i,1,x);
}
for(i=1;i<=m;i++)
{scanf("%d %d %d",&ok,&a,&b);
if(ok==1)
upd(1,n,a,1,b);
else
{x=querry(1,n,a,b,1);
printf("%d\n",x);}
}
return 0;}