#include<stdio.h>
#define lg 100005
int n,m,init[lg],t[260000],a,b,rez;
inline int max(int aa,int bb){
return aa>bb?aa:bb;
}
void cstr(int st,int dr,int poz){
if(st==dr){
init[st]=poz;
return;
}
int x=(st+dr)/2;
cstr(st,x,2*poz);
cstr(x+1,dr,2*poz+1);
}
void update(int poz, int val){
int x=init[poz];
t[x]=val;
x>>=1;
while(x){
t[x]=max(t[2*x],t[2*x+1]);
x>>=1;
}
}
void query(int st,int dr,int poz){
if(st>b || dr<a)
return;
if(a<=st && dr<=b)
rez=max(rez,t[poz]);
else{
if(st<dr){
int x=(st+dr)/2;
query(st,x,poz*2);
query(x+1,dr,poz*2+1);
}
}
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i,x;
scanf("%d%d",&n,&m);
cstr(1,n,1);
for(i=1;i<=n;++i){
scanf("%d",&x);
update(i,x);
}
for(i=0;i<m;++i){
scanf("%d%d%d",&x,&a,&b);
if(!x){
rez=0;
query(1,n,1);
printf("%d\n",rez);
}
else
update(a,b);
}
fclose(stdin);
fclose(stdout);
return 0;
}