#include <cstdio>
#define MAXN 100000
int arb[4*MAXN];
int v[MAXN];
int M,N;
int position,value,intLeft,intRight;
inline void BuildArbInt(int node, int left, int right)
{
if( left == right ){
arb[node] = v[left];
return;
}
int node2 = 2*node;
int mid = (left+right)/2;
BuildArbInt(node2,left,mid);
BuildArbInt(node2+1,mid+1,right);
register int unu = arb[node2];
register int doi = arb[node2+1];
if( unu > doi )
arb[node] = unu;
else
arb[node] = doi;
}
inline void ChangeValue(int node, int left, int right)
{
if( left == right ){
arb[node] = value;
return;
}
int mid = (left+right)/2;
register int node2 = 2*node;
if(position <= mid )
ChangeValue(node2,left,mid);
else
ChangeValue(node2+1,mid+1,right);
register int unu = arb[node2];
register int doi = arb[node2+1];
if( unu > doi )
arb[node] = unu;
else
arb[node] = doi;
}
inline int GetMax(int node, int left, int right)
{
if( intLeft <= left && right<=intRight){
return arb[node];
}
int node2 = 2*node;
int mid = (left+right)/2;
// left ( left, mid ) , right( mid + 1 , right )
int val1=0,val2=0;
if( intLeft <= mid )
val1 = GetMax(node2,left,mid);
if( intRight > mid )
val2 = GetMax(node2+1,mid+1,right);
if( val1 > val2 )
return val1;
return val2;
}
int main(int argc, char* argv[])
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
int i,op,a,b;
for(i=1;i<=N;i++){
scanf("%d",&a);
v[i] = a;
}
BuildArbInt(1,1,N);
for(i=0;i<M;i++){
scanf("%d%d%d",&op,&a,&b);
if( op == 0 ){
intLeft = a;
intRight = b;
printf("%d\n",GetMax(1,1,N));
}
else{
position = a;
value = b;
ChangeValue(1,1,N);
}
}
return 0;
}