#include<stdio.h>
#define max 200010
int arb[max],v[max],nrn,nro;
void InitArb(int node,int left,int right)
{
if( left==right )
arb[node]=v[left];
else
{
InitArb(2*node,left,(left+right)/2);
InitArb(2*node+1,(left+right)/2+1,right);
if( arb[2*node] >= arb[2*node+1] )
arb[node]=arb[2*node];
else
arb[node]=arb[2*node+1];
}
}
void Edit( int value, int pos, int left, int right, int node )
{
if( left<=pos && pos<=right)
{
if(left==right)
arb[node]=value;
else
{
Edit(value,pos,left,(left+right)/2,2*node);
Edit(value,pos,(left+right)/2+1,right,2*node+1);
if( arb[2*node] >= arb[2*node+1] )
arb[node]=arb[2*node];
else
arb[node]=arb[2*node+1];
}
}
}
int Question(int node, int left, int right, int a, int b)
{
int st=0,dr=0;
if( a<= left && right<=b )
return arb[node];
else
{
if( a<= ((left+right)/2) )
st=Question( 2*node, left, (left+right)/2, a,b);
if( b > ((left+right)/2) )
dr=Question( 2*node+1, (left+right)/2+1, right, a, b);
}
return ( st>dr ) ? st:dr;
}
void Solve()
{
InitArb(1,1,nrn);
int x,a,b;
for(int i=1; i<=nro; i++)
{
scanf("%d %d %d",&x,&a,&b);
switch(x)
{
case 0:
printf("%d\n",Question(1,1,nrn,a,b));
break;
case 1:
Edit(b,a,1,nrn,1);
break;
default:
break;
}
}
}
void Read_Data()
{
scanf("%d %d",&nrn,&nro);
for(int i=1;i<=nrn;i++)
scanf("%d",&v[i]);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
Read_Data();
Solve();
//Print_Resault();
return 0;
}