#include <cstdlib>
#include <fstream>
using namespace std;
const int NMAX = (1 << 18) | 1;
int aint[NMAX];
inline int _max(int x, int y) {return x >= y ? x : y;}
inline void Update(int index, int left, int right, const int& pIndex, const int& pValue)
{
if(left == right)
{
aint[index] = pValue;
return;
}
int middle = (left + right) >> 1;
if(pIndex <= middle) Update(index << 1, left, middle, pIndex, pValue);
else Update((index << 1 ) | 1, middle + 1, right, pIndex, pValue);
aint[index] = _max(aint[index << 1], aint[(index << 1) | 1]);
}
inline int Query(int index, int left, int right, const int& start, const int& end)
{
if(left >= start && right <= end) return aint[index];
int middle = (left + right) >> 1, m1, m2;
m1 = m2 = -(1 << 30);
if(start <= middle) m1 = Query(index << 1, left, middle, start, end);
if(end > middle) m2 = Query((index << 1) | 1, middle + 1, right, start, end);
return _max(m1, m2);
}
int main()
{
int N, M, x, i, start, end, op;
ifstream in("arbint.in");
ofstream out("arbint.out");
in >> N >> M;
for(i = 1; i <= N; ++i)
{
in >> x;
Update(1, 1, N, i, x);
}
for(; M; --M)
{
in >> op >> start >> end;
if(0 == op)
{
out << Query(1, 1, N, start, end) << '\n';
}
else Update(1, 1, N, start, end);
}
return EXIT_SUCCESS;
}