#include<stdio>
#include <iostream>
#define lg 100005
using namespace std;
int n,m,init[lg],t[4*lg+200],a,b,rez;
inline int max(int aa,int bb){
return aa>bb?aa:bb;
}
// vectorul init
void construiesc(int st,int dr,int poz){
if(st==dr){
init[st]=poz;
return;
}
int x=(st+dr)/2;
construiesc(st,x,2*poz);
construiesc(x+1,dr,2*poz+1);
}
//***************ACTUALIZARE
void actualizez(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;
}
}
//************INTEROGARE
void interogare(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;
interogare(st,x,poz*2);
interogare(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);
construiesc(1,n,1);
printf("\n");
//*************CITIRE ELEMENTE
for(i=1;i<=n;++i){
scanf("%d",&x);
actualizez(i,x);
}
//****************EFECTUARE TESTE
for(i=0;i<m;++i){
scanf("%d%d%d",&x,&a,&b);
if(!x){
rez=0;
interogare(1,n,1);
printf("%d\n",rez);
}
else
actualizez(a,b);
}
printf("\n");
fclose(stdin);
fclose(stdout);
return 0;
}