#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define max(A, B) ((A >= B) ? A : B)
#define MAX_DIM_INPUT 100000
vector<int> aint(4 * MAX_DIM_INPUT, 0);
int N, M;
void update(int root, int arrayPos, int left, int right, int value)
{
if (left == right)
{
aint[root] = value;
return;
}
int mid = (left + right) / 2;
if (arrayPos <= mid)
{
update(2 * root, arrayPos, left, mid, value);
}
else
{
update(2 * root + 1, arrayPos, mid + 1, right, value);
}
aint[root] = max(aint[2 * root], aint[2 * root + 1]);
}
int query(int root, int a, int b, int left, int right)
{
if (a <= left && right <= b)
{
return aint[root];
}
int mid = (left + right) / 2;
int maxim1 = -1;
int maxim2 = -1;
if (a <= mid)
{
maxim1 = query(2 * root, a, b, left, mid);
}
if (mid < b)
{
maxim2 = query(2 * root + 1, a, b, mid + 1, right);
}
return max(maxim1, maxim2);
}
int main()
{
fin >> N >> M;
for (int i = 1; i <= N; i++)
{
int value = 0;
fin >> value;
update(1, i, 1, N, value);
}
while (M > 0)
{
int type, a, b;
fin >> type >> a >> b;
if (type == 0)
{
fout << query(1, a, b, 1, N) << '\n';
}
else
{
update(1, a, 1, N, b);
}
M--;
}
return 0;
}