#include <bits/stdc++.h>
using namespace std;
ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );
#define MAXN 100000
int aint[4 * MAXN];
int v[MAXN + 1], n;
int fs( int x )
{
return 2 * x;
}
int fd( int x )
{
return 2 * x + 1;
}
int op( int a, int b )
{
return max( a, b );
}
void build( int nod, int st, int dr )
{
int mij;
if( st == dr )
{
aint[nod] = v[st];
return ;
}
mij = ( st + dr ) / 2;
build( fs( nod ), st, mij );
build( fd( nod ), mij + 1, dr );
aint[nod] = op( aint[fs( nod )], aint[fd( nod )] );
}
void update( int nod, int st, int dr, int poz, int val )
{
int mij;
if( st == dr )
{
aint[nod] = val;
return ;
}
mij = ( st + dr ) / 2;
if( poz <= mij )
update( fs( nod ), st, mij, poz, val );
else
update( fd( nod ), mij + 1, dr, poz, val );
aint[nod] = op( aint[fs( nod )], aint[fd( nod )] );
}
int query( int nod, int st, int dr, int qs, int qd )
{
int q1, q2, mij;
if( qs > dr || st > qd )
return 0;
if( qs <= st && qd >= dr )
return aint[nod];
mij = ( st + dr ) / 2;
q1 = q2 = 0;
if( qs <= mij )
q1 = query( fs( nod ), st, mij, qs, qd );
if( qd > mij )
q2 = query( fd( nod ), mij + 1, dr, qs, qd );
return op( q1, q2 );
}
int main()
{
int n, m, t, x, y, i;
fin >> n >> m;
for( i = 1; i <= n; i++ )
fin >> v[i];
build( 1, 1, n );
for( i = 1; i <= m; i++ )
{
fin >> t >> x >> y;
if( t == 0 )
fout << query( 1, 1, n, x, y ) << '\n';
else
update( 1, 1, n, x, y );
}
return 0;
}