#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100005
int t[4 * MAX_N], v[4 * MAX_N];
void build( int node, int le, int ri, int *v ){
if( le == ri ){
t[node] = v[ri];
return;
}
int mid = ( le + ri ) / 2;
build( 2 * node, le, mid, v );
build( 2 * node + 1, mid + 1, ri, v );
t[node] = max( t[2 * node], t[2 * node + 1] );
}
void update( int node, int le, int ri, int pos, int val ){
if( le == ri ){
t[node] = val;
v[pos] = val;
return;
}
int mid = ( le + ri ) / 2;
if( pos <= mid ){
update( 2 * node, le, mid, pos, val );
}
else{
update( 2 * node + 1, mid + 1, ri, pos, val );
}
t[node] = max( t[2 * node], t[2 * node + 1] );
}
void query( int node, int le, int ri, int a, int b, int &ans ){
if( a <= le && ri <= b ){
ans = max( ans, t[node] );
return;
}
int mid = ( le + ri ) / 2;
if( a <= mid ){
query( 2 * node, le, mid, a, b, ans );
}
if( b > mid ){
query( 2 * node + 1, mid + 1, ri, a, b, ans );
}
}
int main(){
ifstream cin( "arbint.in" );
ofstream cout( "arbint.out" );
int n, m, i, c, x, y;
cin >> n >> m;
for( i = 1; i <= n; i++ )
cin >> v[i];
build( 1, 1, n, v );
for( i = 0; i < m; i++){
cin >> c >> x >> y;
if( c == 1 )
update( 1, 1, n, x, y );
else{
int mx = -INT_MAX;
query( 1, 1, n, x, y, mx );
cout << mx << "\n";
}
}
return 0;
}