#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int maxx;
int v[100001], aint[400001];
void build( int nod, int st, int dr )
{
if ( st == dr )
{
aint[nod] = v[st];
return;
}
int m = ( st + dr ) / 2;
build ( nod * 2, st, m );
build ( nod * 2 + 1, m + 1, dr );
aint[nod] = max ( aint[nod * 2], aint[nod * 2 + 1] );
}
void update( int nod, int st, int dr, int poz, int val )
{
if ( st == dr )
{
aint[nod] = val;
return;
}
int m = ( st + dr ) / 2;
if ( poz <= m )
update( 2 * nod, st, m, poz, val );
else update( 2 * nod + 1, m + 1, dr, poz, val );
aint[nod] = max ( aint[nod * 2], aint[nod * 2 + 1] );
}
void query( int nod, int st, int dr, int a, int b )
{
if ( st > b || dr < a )
return;
if ( a <= st && dr <= b )
{
maxx = max( maxx, aint[nod] );
return;
}
int m = ( st + dr ) / 2;
query( nod * 2, st, m, a, b );
query( nod * 2 + 1, m + 1, dr, a, b );
}
int main()
{
int n, q, i;
f >> n >> q;
for ( i = 1; i <= n; i ++ )
f >> v[i];
build( 1, 1, n );
while ( q -- )
{
int c, a, b;
f >> c >> a >> b;
if ( c == 0 )
{
query( 1, 1, n, a, b );
g << maxx << '\n';
maxx = 0;
}
else
{
update( 1, 1, n, a, b );
}
}
return 0;
}