#include<fstream>
using namespace std;
ifstream fin( "arbint.in" );
ofstream fout( "arbint.out" );
const int nmax = 100000;
int ans, upoz;
int ai[ 4 * nmax + 1 ];
inline int max2( int x, int y ) {
if ( x < y ) {
return y;
} else {
return x;
}
}
void update( int st, int dr, int poz, int x ) {
int mid;
if ( st == dr ) {
ai[ poz ] = x;
return ;
}
mid = ( st + dr ) / 2;
if ( mid < upoz ) {
update( mid + 1, dr, 2 * poz + 1, x );
} else {
update( st, mid, 2 * poz, x );
}
ai[ poz ] = max2( ai[ 2 * poz ], ai[ 2 * poz + 1 ] );
}
void query( int stp, int drp, int st, int dr, int poz ) {
if ( stp <= st && dr <= drp ) {
ans = max2( ans, ai[ poz ] );
return ;
}
int mid = ( st + dr ) / 2;
if ( mid >= stp ) {
query( stp, drp, st, mid, 2 * poz );
}
if ( mid + 1 <= drp ) {
query( stp, drp, mid + 1, dr, 2 * poz + 1 );
}
}
int main() {
int n, m, x, y, k;
fin >> n >> m;
for( int i = 1; i <= n; ++ i ) {
fin >> x;
upoz = i;
update( 1, n, 1, x );
}
for( int i = 0; i < m; ++ i ) {
fin >> k >> x >> y;
if ( k == 1 ) {
upoz = x;
update( 1, n, 1, y );
} else {
ans = -1 << 30;
query( x, y, 1, n, 1 );
fout << ans << "\n";
}
}
fin.close();
fout.close();
return 0;
}