#define MAX_N 100000
#define MAX_N_CEILED 131072
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct
{
void set(int node, int left, int right, int index, int value)
{
if (left == right)
{
data[node] = value;
return;
}
int mid = (left + right) / 2;
if (index <= mid)
set(node * 2, left, mid, index, value);
else
set(node * 2 + 1, mid + 1, right, index, value);
data[node] = max(data[node * 2], data[node * 2 + 1]);
}
int get(int node, int left, int right, int qleft, int qright)
{
if (qleft <= left && right <= qright)
return data[node];
int mid = (left + right) / 2, ma = 0;
if (qleft <= mid)
ma = max(ma, get(node * 2, left, mid, qleft, qright));
if (qright >= mid + 1)
ma = max(ma, get(node * 2 + 1, mid + 1, right, qleft, qright));
return ma;
}
int data[2 * MAX_N_CEILED];
} it;
int main()
{
int N, M;
fin >> N >> M;
for (int i = 1; i <= N; ++i)
{
int Ai;
fin >> Ai;
it.set(1, 1, N, i, Ai);
}
for (int i = 1; i <= M; ++i)
{
int op, a, b;
fin >> op >> a >> b;
if (op == 0)
fout << it.get(1, 1, N, a, b) << '\n';
else if (op == 1)
it.set(1, 1, N, a, b);
}
return 0;
}