#include<stdio.h>
# define MAX 100001
using namespace std;
int n,m,ARB[4*MAX+66];
int op,a,b,poz,val,S,F,x,maxim;
inline int maximul(int a, int b) {
if ( a > b ) return a;
return b;
}
void Update(int nod,int left,int right)
{ if (left==right)
{ARB[nod]=val;
return; }
int div = (left+right)/2;
if (poz<= div)
Update(2*nod,left,div);
else
Update(2*nod+1,div+1,right);
ARB[nod]=maximul(ARB[2*nod],ARB[2*nod+1]);
}
void Query(int nod,int left,int right)
{if (S<=left && right<=F )
{ if ( maxim < ARB[nod] ) maxim = ARB[nod];
return;
}
int div = (left+right)/2;
if ( S<=div )
Query(2*nod,left,div);
if ( div<F )
Query(2*nod+1,div+1,right);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++)
{ scanf("%d",&x);
poz=i; val=x;
Update(1,1,n);
}
for ( int i = 1; i <= m; i++ )
{
scanf("%d%d%d", &op, &a, &b);
if ( op == 0 )
{ maxim = -1;
S=a, F=b;
Query(1,1,n);
printf("%d\n", maxim);
}
else
{
poz=a,val=b;
Update(1,1,n);
}
}
}