#include <iostream>
#include <fstream>
std::ifstream fin ( "arbint.in" );
std::ofstream fout ( "arbint.out" );
const int NMAX = 100000;
const int INF = 1<<30;
class Aint {
private : int aint[1 + 4 * NMAX];
public :
Aint(){};
~Aint(){};
void update ( int p, int poz, int val, int left, int right );
int query ( int p, int b, int e, int left, int rigth );
};
void Aint::update ( int p, int poz, int val, int left, int right ) {
if ( left == right ) {
aint[p] = val;
return ;
}
int mid = ( left + right ) / 2;
if ( poz <= mid )
update ( 2 * p, poz, val, left, mid );
else
update ( 2 * p + 1, poz, val, mid + 1, right );
aint[p] = std::max ( aint[2 * p], aint[2 *p + 1] );
}
int Aint::query ( int p, int b, int e, int left, int right ) {
if ( b <= left && right <= e )
return aint[p];
int mid = ( left + right ) / 2;
int ans1 = -INF, ans2 = -INF;
if ( b <= mid )
ans1 = query ( 2 * p, b, e, left, mid );
if ( e > mid )
ans2 = query ( 2 * p + 1, b, e, mid + 1, right );
return std::max ( ans1, ans2 );
}
int main() {
int N, M;
Aint aint = Aint();
fin >> N >> M;
for ( int i = 1; i <= N; ++i ) {
int x;
fin >> x;
aint.update ( 1, i, x, 1, N );
}
for ( int i = 1; i <= M; ++i ) {
int op, a, b;
fin >> op >> a >> b;
if ( op == 0 )
fout << aint.query ( 1, a, b, 1, N ) << '\n';
else
aint.update ( 1, a, b, 1, N );
}
fin.close();
fout.close();
return 0;
}