#include <fstream>
#include <iostream>
#include <cstdio>
using namespace std;
#define dim 100010
#define DBG 0
//ifstream fin("arbint.in");
//ofstream fout("arbint.out");
FILE* in = fopen("arbint.in","r");
FILE* out = fopen("arbint.out","w");
int Arb[4*dim],i,j,n,m,pos,x,y,val,q,ans,start,finish,v[dim];
void _Update(int nod, int left, int right)
{
if( left == right )
{
Arb[ nod ] = val;
return;
}
int middle = ( left + right ) / 2;
if( pos <= middle )
_Update( 2 * nod , left , middle );
else
_Update( 2 * nod + 1 , middle + 1 , right );
Arb[ nod ] = max( Arb[ 2 * nod ] , Arb[ 2 * nod + 1 ] );
}
void _Query(int nod, int left, int right)
{
if ( start > right || finish < left ) return;
if( left >= start && right <= finish )
{
if( ans < Arb[ nod ] )
ans = Arb[ nod ];
return;
}
//if( left == right ) return;
int middle = ( left + right ) / 2;
if ( start <= middle ) _Query( 2 * nod , left , middle );
if ( finish > middle) _Query( 2 * nod + 1 , middle + 1 , right );
}
void _Build(int nod, int left, int right)
{
if( left == right )
{
Arb[ nod ] = v[ left ];
return;
}
int middle = ( left + right ) / 2;
_Build( 2 * nod , left , middle );
_Build( 2 * nod + 1 , middle + 1 , right );
Arb[ nod ] = max( Arb[ 2 * nod ] , Arb[ 2 * nod + 1 ] );
}
int main()
{
fscanf(in,"%d %d",&n,&m);
for(i=1 ; i<=n ; ++i)
fscanf(in,"%d",&v[i]);
_Build( 1 , 1 , n );
for(i=1 ; i<=m ; ++i)
{
fscanf(in,"%d %d %d",&q,&x,&y);
if( q == 1 )
{
pos = x;
val = y;
_Update( 1 , 1 , n );
if(DBG)
cerr<<"update "<<i<<'\n';
}
else
{
ans = -1;
start = x;
finish = y;
_Query( 1 , 1 , n );
fprintf(out,"%d\n",ans);
if(DBG)
cerr<<"query "<<i<<'\n';
}
}
return 0;
}