#include<cstdio>
using namespace std;
int v[200001],rez,n,m,c,ordmax;
int a[200001];
int maxim(int nr1,int nr2){
if(nr1>nr2)
return nr1;
return nr2;
}
int construiesc(int l1,int l2,int ord){
if(l1==l2){
a[ord]=v[l1];
return a[ord];
}
else{
if(a[ord*2]==-1)
a[ord*2]=construiesc(l1,(l1+l2)/2,ord*2);
if(a[ord*2+1]==-1)
a[ord*2+1]=construiesc(((l1+l2)/2)+1,l2,ord*2+1);
a[ord]=maxim(a[ord*2],a[ord*2+1]);
return a[ord];
}
}
void modif(int poz,int val){
int ord=ordmax-(rez-n)-(n-poz);
a[ord]=val;
bool pp=true;
int maxx;
while(ord>=1&&pp==true){
maxx=maxim(a[(ord/2) *2],a[(ord/2) *2 +1]);
if(a[ord/2]==maxx)
pp=false;
else{
a[ord/2]=maxx;
ord/=2;
}
}
}
int rezult(int l1,int l2,int ord,int st,int dr){
if(l1==st&&l2==dr)
return a[ord];
else{
// l1 (l1+l2)/2 + (l1+l2)/2+1 l2
if(dr<=(l1+l2)/2)
return rezult(l1, (l1+l2)/2 , ord*2, st, dr);
else
if(st>=((l1+l2)/2)+1)
return rezult(((l1+l2)/2)+1, l2, ord*2+1, st,dr);
else
if(st<=(l1+l2)/2 && dr>=((l1+l2)/2)+1)
return maxim( rezult(l1,(l1+l2)/2,ord*2,st,(l1+l2)/2), rezult(((l1+l2)/2)+1,l2,ord*2+1,((l1+l2)/2)+1,dr));
}
}
int main(){
int st,dr;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
rez=1;
while(rez<n){
rez*=2;
}
for(int i=1;i<=rez*2;i++)
a[i]=-1;
ordmax=0;
int i=rez;
while(i>=1){
ordmax+=i;
i/=2;
}
construiesc(1,rez,1);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&c,&st,&dr);
if(c==0)
printf("%d\n",rezult(1,rez,1,st,dr));
if(c==1)
modif(st,dr);
}
return 0;
}