#include <bits/stdc++.h>
using namespace std;
ifstream f ( "arbint.in" );
ofstream g ( "arbint.out" );
const int NMAX = 100001;
int a[NMAX], mx[4 * NMAX];
int sz = 1;
void build ( int l, int r, int x )
{
if ( r - l == 1 )
{
if ( l < 2 * sz - 1 )
mx[x] = a[l];
else mx[x] = INT_MIN;
return;
}
int m = ( l + r ) / 2;
build ( l, m, 2 * x + 1 );
build ( m, r, 2 * x + 2 );
mx[x] = max ( mx[2 * x + 1], mx[2 * x + 2] );
}
int MX ( int l, int r, int x, int lx, int rx )
{
if ( lx >= l && rx <= r )
return mx[x];
if ( rx <= l || lx >= r )
return INT_MIN;
int m = ( rx + lx ) / 2;
int mx1 = MX ( l, r, 2 * x + 1, lx, m );
int mx2 = MX ( l, r, 2 * x + 2, m, rx );
return max ( mx1, mx2 );
}
void sett ( int i, int val, int x, int lx, int rx )
{
if ( rx - lx == 1 )
{
mx[x] = val;
return;
}
int m = ( lx + rx ) / 2;
if ( i < m )
sett ( i, val, 2 * x + 1, lx, m );
else sett ( i, val, 2 * x + 2, m, rx );
mx[x] = max ( mx[2 * x + 1], mx[2 * x + 2] );
}
int main()
{
int N, M;
f >> N >> M;
for ( int i = 0; i < N; i++ )
f >> a[i];
while ( sz < N )
sz *= 2;
build ( 0, sz, 0 );
while ( M-- )
{
int op, a, b;
f >> op >> a >> b;
if ( op == 0 )
{
g << MX ( a - 1, b, 0, 0, sz ) << '\n';
}
else
{
sett ( a - 1, b, 0, 0, sz );
}
}
return 0;
}