#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;
int mij=(st+dr)>>1;
cstr(st,mij,pos<<1);
cstr(mij+1,dr,(pos<<1)+1);
}
void update(int pos,int val)
{
int k=init[pos];
arb[k]=val;
for(k>>1;k>0;k>>1)
arb[k]=max(arb[k<<1],arb[(k<<1)+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)>>1;
return max(caut(st,mij,pos<<1),caut(mij+1,dr,(pos<<1)+1));
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
scanf("%d%d",&n,&m);
int aux;
for(int i=1;i<=n;++i)
{
scanf("%d",&aux);
update(i,x);
}
for(int i=0;i<m;++i)
{
scanf("%d",&aux);
if(!aux)
{
int val;
scanf("%d%d",&val,&aux);
update(aux,val);
}
else
{
scanf("%d%d",&x,&y);
printf("%d",caut(1,n,1));
}
}
return 0;
}