#include <stdio.h>
#include <iostream>
using namespace std;
int tip,b,k,j,a2,n,m;
int a[1001*1001];
int arb[1001*1001];
void creare(int nod,int st,int dr){
if(st==dr) arb[nod]=a[st];
else{
int mij=(st+dr)/2;
creare(2*nod,st,mij);
creare(2*nod+1,mij+1,dr);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
void update(int nod,int st,int dr,int a,int b){
if(st==dr) arb[nod]=b;
else{
int mij=(st+dr)/2;
if(a<=mij) update(2*nod,st,mij,a,b);
else update(2*nod+1,mij+1,dr,a,b);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
int querry(int nod,int st,int dr,int a,int b){
if(a<=st&&dr<=b) return arb[nod];
else{
int x1,x2,mij=(st+dr)/2;
x1=x2=0;
if(a<=mij) x1=querry(2*nod,st,mij,a,b);
if(b>mij) x2=querry(2*nod+1,mij+1,dr,a,b);
return max(x1,x2);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
creare(1,1,n);
for(k=1;k<=m;k++){
scanf("%d%d%d",&tip,&a2,&b);
if(tip==1){update(1,1,n,a2,b);}
else{
printf("%d\n",querry(1,1,n,a2,b));
}
}
return 0;
}