#include <fstream>
#include <vector>
using namespace std ;
ifstream cin ("arbint.in") ;
ofstream cout ("arbint.out") ;
class SegmentTree{
public :
SegmentTree (int nn)
{
n = nn ;
aint.resize(nn*4) ;
}
void Update (int pos, int val)
{
update (1, 1, n, pos, val) ;
}
int Solution (int a, int b)
{
return query(1, 1, n, a, b) ;
}
private :
vector <int> aint ;
int n ;
void update (int nod, int st, int dr, int pos, int val)
{
if (st == dr) {
aint [nod] = val ;
return ;
}
int mij = (st + dr) >> 1 ;
if (pos <= mij) {
update (nod << 1, st, mij, pos, val) ;
}
else {
update (nod << 1|1, mij + 1, dr, pos, val) ;
}
aint [nod] = max(aint [nod << 1], aint[nod<<1|1]);
}
int query (int nod, int st, int dr, int a, int b)
{
if (a <= st and dr <= b) {
return aint [nod] ;
}
int maxim = 0 ;
int mij = (st + dr) >> 1 ;
if (a <= mij) {
maxim = max (maxim , query(nod << 1, st, mij, a, b)) ;
}
if (b > mij) {
maxim = max (maxim , query(nod << 1 |1, mij + 1, dr, a, b)) ;
}
return maxim ;
}
};
int main()
{
int n, m ;
cin >> n >> m ;
SegmentTree *A = new SegmentTree(n) ;
for (int i = 1; i <= n; ++ i) {
int x ;
cin >> x ;
A -> Update (i, x) ;
}
while ( m -- ) {
int tip ;
cin >> tip ;
if (tip == 1) {
int a, b ;
cin >> a >> b ;
A -> Update (a, b) ;
}
else {
int a, b ;
cin >> a >> b ;
cout << A -> Solution (a, b) << '\n' ;
}
}
return 0;
}