#include <iostream>
#include <stdio.h>
#include <algorithm>
#define NMAX 2000000
using namespace std;
int aint [ NMAX + 1 ] ;
void update (int a, int b, int st, int dr, int i) {
int mij = ( st + dr ) / 2 ;
if (st == dr )
aint[i] = b ;
else {
if (a <= mij )
update (a, b, st, mij, i*2 ) ;
else
update (a, b, mij+1, dr, i*2+1 ) ;
aint[i] = max (aint[i*2], aint[i*2+1] ) ;
}
}
int maxint (int left, int right, int st, int dr, int i) {
if (st == left && dr == right )
return aint[i] ;
else {
int mij = ( st + dr ) / 2 ;
if (right <= mij )
return maxint (left, right, st, mij, i*2) ;
else {if (left > mij )
return maxint (left, right, mij+1, dr, i*2+1) ;
else
return max (maxint(mij, right, mij, dr, i*2+1), maxint(left, mij, st, mij, i*2) ) ;
}
}
}
int main() {
FILE *fin, *fout ;
fin = fopen ("arbint.in", "r" ) ;
fout = fopen ("arbint.out", "w" ) ;
int n, i, m, nr1, nr2, op, elem ;
fscanf (fin, "%d%d", &n, &m) ;
for (i = 0 ; i < n ; i ++ ) {
fscanf (fin, "%d", &elem ) ;
update (i+1, elem, 1, n, 1 ) ;
}
for (i = 0 ; i < m ; i++ ) {
fscanf (fin, "%d%d%d", &op, &nr1, &nr2 ) ;
if (op == 1 )
update (nr1, nr2, 1, n, 1 ) ;
else
fprintf (fout, "%d\n", maxint(nr1, nr2, 1, n, 1) ) ;
}
return 0;
}