//arbori de intervale
#include <cstdio>
#define max(a,b) (a>b ? a:b)
int n,m,v[200002],x,a,b,maxim,i;
void Update(int vf,int ls,int ld,int poz,int val){
if (ls==ld) v[vf]=val;
else
{int mij=(ls+ld)/2;
if (poz<=mij) Update(2*vf,ls,mij,poz,val);
else Update(2*vf+1,mij+1,ld,poz,val);
v[vf]=max(v[2*vf],v[2*vf+1]);}
}
void Query(int vf,int ls,int ld,int a,int b){
if (a<=ls && ld<=b){
if (maxim<v[vf]) maxim=v[vf];
}
else
{int mij=(ls+ld)/2;
if (a<=mij) Query(2*vf,ls,mij,a,b);
if (mij<b) Query(2*vf+1,mij+1,ld,a,b);}
}
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);
Update(1,1,n,i,x);}
while (m--){
scanf("%d %d %d",&x,&a,&b);
if (x==1) Update(1,1,n,a,b);
else {maxim=-1;
Query(1,1,n,a,b);
printf("%d\n",maxim);}
}
return 0;
}