#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define maxarb 300001
int arbore[maxarb] ;
int n, m ;
int sol ;
void modifica(int value, int poz, int nod, int st, int dr)
{
if( st == dr )
{
arbore[nod] = value ;
return ;
}
int mij = ( st + dr ) >> 1 ;
int fiust = 2 * nod ;
int fiudr = 2 * nod + 1 ;
if( poz <= mij )
modifica( value, poz, fiust, st, mij ) ;
else
modifica( value, poz, fiudr, mij + 1, dr ) ;
arbore[nod] = max( arbore[fiust], arbore[fiudr] ) ;
}
void query(int a, int b, int nod, int st, int dr)
{
if( a <= st && dr <= b )
{
sol = max( sol, arbore[nod] ) ;
return;
}
int mij = ( st + dr ) >> 1 ;
int fiust = 2 * nod ;
int fiudr = 2 * nod + 1 ;
if( a <= mij )
query( a, b, fiust, st, mij ) ;
if( mij < b )
query( a, b, fiudr, mij + 1, dr ) ;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i )
{
int x ;
scanf("%d", &x);
modifica( x, i, 1, 1, n ) ;
}
for(int i = 1; i <= m; ++i )
{
int cod, a, b ;
scanf("%d%d%d", &cod, &a, &b );
if( cod == 0 )
{
sol = -1 ;
query( a, b, 1, 1, n ) ;
printf("%d\n", sol);
}
else
modifica( b, a, 1, 1, n ) ;
}
}