#include<cstdio>
int arb[400001];
int maxi(int a,int b){
if(a>b)
return a;
else
return b;
}
void build(int nod,int st,int dr,FILE *fin){
if(st==dr){
fscanf(fin,"%d",&arb[nod]);
return;
}
int mid=(st+dr)/2;
build(2*nod,st,mid,fin);
build(2*nod+1,mid+1,dr,fin);
arb[nod]=maxi(arb[2*nod],arb[2*nod+1]);
}
void update(int nod,int st,int dr,int poz,int val){
if(st==dr){
arb[nod]=val;
return;
}
int mid=(st+dr)/2;
if(poz<=mid)
update(2*nod,st,mid,poz,val);
else
update(2*nod+1,mid+1,dr,poz,val);
arb[nod]=maxi(arb[2*nod],arb[2*nod+1]);
}
int query(int nod,int l,int r,int st,int dr){
if(st<=l&&r<=dr)
return arb[nod];
int mid=(l+r)/2;
if(dr<=mid)
return query(2*nod,l,mid,st,dr);
if(st>mid)
return query(2*nod+1,mid+1,r,st,dr);
return maxi(query(2*nod,l,mid,st,dr),query(2*nod+1,mid+1,r,st,dr));
}
int main(){
int n,m,i,o,a,b;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
build(1,1,n,stdin);
for(i=1;i<=m;i++){
scanf("%d%d%d",&o,&a,&b);
if(o==0)
printf("%d\n",query(1,1,n,a,b));
else
update(1,1,n,a,b);
}
return 0;
}