#include <stdio.h>
#define NMax 100010
#define oo 2000000000
const char IN[]="arbint.in",OUT[]="arbint.out";
int N,M;
int arb[5*NMax] , v[NMax];
inline int max(int a,int b){
return a>b ? a : b;
}
void make(int poz,int st,int dr){
if (st==dr){
arb[poz]=v[st];
return;
}
int m=(st+dr)>>1;
make(2*poz,st,m);
make(2*poz+1,m+1,dr);
arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}
void Update(int poz,int st,int dr,int x,int v){
if (st==dr){
arb[poz]=v;
return;
}
int m=(st+dr)>>1;
if (x<=m) Update(2*poz,st,m,x,v);
else Update(2*poz+1,m+1,dr,x,v);
arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}
int Query(int poz,int st,int dr,int x,int y){
if ( x<=st && dr<=y )
return arb[poz];
int m=(st+dr)>>1,r=-oo,r2=-oo;
if (x<=m) r =Query(2*poz,st,m,x,y);
if (y >m) r2=Query(2*poz+1,m+1,dr,x,y);
return max(r,r2);
}
int main()
{
int i,c,x,y;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M);
for (i=1;i<=N;++i) scanf("%d",v+i);
make(1,1,N);
freopen(OUT,"w",stdout);
while (M--){
scanf("%d%d%d",&c,&x,&y);
if (!c)
printf("%d\n",Query(1,1,N,x,y));
else
Update(1,1,N,x,y);
}
fclose(stdout);
fclose(stdin);
return 0;
}