#include<cstdio>
int n,x,y,tip,i,m;
inline int mij( int x,int y )
{
return (x+y)/2;
}
inline int max( int x,int y )
{
return ( x>y ? x:y) ;
}
const int N=280001;
int arb[N],init[N];
void build( int st , int dr , int poz )
{
int mj=mij(st,dr);
if( st==dr )
{
init[st]=poz;
return;
}
build(st,mj,2*poz);
build(mj,dr,2*poz+1);
}
void up(int poz,int val)
{
int k=init[poz];
arb[k]=val;
for( k/=2 ; k ; k/=2 )
arb[k]= max(arb[2*k],arb[2*k+1]) ;
}
int caut( int st,int dr,int poz )
{
if( x<=st && dr<=y )
return arb[poz];
if( st>y || dr<x )
return 0;
int x=(st+dr)/2;
return max(caut(st,x,2*poz),caut(x+1,dr,2*poz+1));
}
int main()
{
freopen("arb.in","r",stdin);
freopen("arb.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
build(1,n,1);
for( int i=1 ; i<=n ; ++i )
{
scanf("%d",&x);
up(i,x);
}
for( int i=1 ; i<=m ; ++i )
{
scanf("%d%d%d",&tip,&x,&y);
if(tip==0)
up(x,y);
else
printf("%d\n",caut(1,n,1));
}
return 0;
}