#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 100000;
int arb[4*MAXN], n, m;
void update_tree( int node, int left, int right, int position, int value )
{
if( left == right )
{
arb[node] = value;
}
else
{
int m = (left+right)/2;
if( m < position )
{
update_tree( 2*node +1 , m + 1, right, position, value );
}
else
{
update_tree( 2*node, left, m, position, value );
}
arb[node] = max( arb[2*node+1], arb[2*node] );
}
}
void querry_tree( int node, int left, int right, int a, int b, int &answer )
{
if( a <= left && right <= b )
{
answer = max(answer, arb[node]);
}
else
{
int m = (left + right) / 2;
if( m < b )
{
querry_tree( 2*node+1, m + 1, right, a, b, answer );
}
if( a <= m )
{
querry_tree( 2*node, left, m, a, b, answer);
}
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d", &n, &m);
int i, value, aux = -1, x, a, b;
for( i = 1; i <= n; i++ )
{
scanf("%d",&value);
update_tree(1,1,n,i,value);
}
for( i = 1; i <= m; i++ )
{
aux = -1;
scanf("%d %d %d", &x, &a, &b);
if( x == 0 )
{
querry_tree(1,1,n,a,b,aux);
printf("%d\n",aux);
}
else
{
update_tree(1,1,n,a,b);
}
}
return 0;
}