#include<stdio.h>
int arb[280000];
int init[100000];
int n,m,x,y;
int max(int a,int b)
{
return (a<b)?b:a;
}
void cstr(int st,int dr,int pos)
{
if(st==dr){
init[st]=pos;
return ;
}
int mij=(st+dr)/2;
cstr(st,mij,2*pos);
cstr(mij+1,dr,2*pos+1);
}
void update(int pos,int val)
{
int k=init[pos];
arb[k]=val;
for(k/=2;k>0;k/=2)
arb[k]=max(arb[2*k],arb[2*k+1]);
}
inline int caut(int st,int dr,int pos)
{
int mij;
if(x<=st&&dr<=y)
return arb[pos];
if(dr<x||st>y)
return 0;
mij=(st+dr)/2;
return max(caut(st,mij,2*pos),caut(mij+1,dr,2*pos+1));
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
scanf("%d%d",&n,&m);
int aux;
cstr(1,n,1);
for(int i=1;i<=n;++i)
{
scanf("%d",&aux);
update(i,aux);
}
for(int i=0;i<m;++i)
{
scanf("%d",&aux);
if(aux)
{
int val;
scanf("%d%d",&aux,&val);
update(aux,val);
}
if(!aux)
{
scanf("%d%d",&x,&y);
printf("%d\n",caut(1,n,1));
}
}
return 0;
}