#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int n = 100000;
int aint[4*n+1], v[n+1];
void build( int nod, int left, int right )
{
if( left == right )
aint[nod] = v[left];
else
{
int mij = left + (right-left)/2;
build( nod*2, left, mij );
build( nod*2+1, mij+1, right );
aint[nod] = max(aint[nod*2], aint[nod*2+1]);
}
}
int query( int nod, int qleft, int qright, int mleft, int mright )
{
if( qleft <= mleft && mright <= qright )
return aint[nod];
else
{
int mij = mleft + (mright-mleft)/2, ans = 0;
if( qleft <= mij )
ans = max(ans, query( nod*2, qleft, qright, mleft, mij ));
if( mij < qright )
ans = max(ans, query( nod*2+1, qleft, qright, mij+1, mright));
return ans;
}
}
void update( int nod, int mleft, int mright, int ind, int val )
{
if( mleft == mright && mleft == ind )
{
aint[nod] = val;
}
else
{
int mij = mleft + (mright-mleft)/2;
if( ind <= mij )
update( nod*2, mleft, mij, ind, val );
else
update( nod*2+1, mij+1, mright, ind, val );
aint[nod] = max(aint[nod*2], aint[nod*2+1]);
}
}
int main() {
int n, m;
f >> n >> m;
for( int i = 1; i <= n; ++i )
f >> v[i];
build( 1, 1, n );
for( int i = 1; i <= m; ++i )
{
int a, b, c;
f >> a >> b >> c;
if( a == 0 )
{
g << query(1, b, c, 1, n) << "\n";
}
else
{
update( 1, 1, n, b, c );
}
}
}