#include <cstdio>
#include<algorithm>
using namespace std;
int n,m,a,b,x;
int maxarb[400070];
int start, finish, val, pos, maxim;
void update(int nod, int left, int right)
{
if ( left == right )
{
maxarb[nod] = val;
return;
}
int mid = (left+right)/2;
if ( pos <= mid ) update(2*nod,left,mid);
else update(2*nod+1,mid+1,right);
maxarb[nod] = max( maxarb[2*nod], maxarb[2*nod+1] );
}
void query(int nod, int left, int right)
{
if ( start <= left && right <= finish )
{
if ( maxim < maxarb[nod] ) maxim = maxarb[nod];
return;
}
int mid = (left+right)/2;
if ( start <= mid ) query(2*nod,left,mid);
if ( mid < finish ) query(2*nod+1,mid+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;
update(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;
query(1,1,n);
printf("%d\n", maxim);
}
else
{
pos = a, val = b;
update(1,1,n);
}
}
}