#include <cstdio>
using namespace std;
int n,m,a,b,x;
int maxarb[400070];
int start, finish, val, pos, maxim;
inline int mx(int a, int b)
{
if ( a > b ) return a;
return b;
}
void actualizare(int nod, int left, int right)
{
if ( left == right )
{
maxarb[nod] = val;
return;
}
int div = (left+right)/2;
if ( pos <= div ) actualizare(2*nod,left,div);
else actualizare(2*nod+1,div+1,right);
maxarb[nod] = mx( maxarb[2*nod], maxarb[2*nod+1] );
}
void Q(int nod, int left, int right)
{
if ( start <= left && right <= finish )
{
if ( maxim < maxarb[nod] ) maxim = maxarb[nod];
return;
}
int div = (left+right)/2;
if ( start <= div ) Q(2*nod,left,div);
if ( div < finish ) Q(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);
pos = i, val = x;
actualizare(1,1,n);
}
for ( int i = 1; i <= m; i++ )
{
scanf("%d%d%d", &x, &a, &b);
if ( x == 0 )
{
maxim = -1;
start = a, finish = b;
Q(1,1,n);
printf("%d\n", maxim);
}
else
{
pos = a, val = b;
actualizare(1,1,n);
}
}
}