#define MAX_N 100000
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct IntervalTree
{
void set(int node, int left, int right, int index, int value)
{
if ((left == right) && (left == index))
data[node] = value;
else
{
int middle = (left + right) / 2;
if (index <= middle)
set(node << 1, left, middle, index, value);
else
set(node << 1 | 1, middle + 1, right, index, value);
data[node] = max(data[node << 1], data[node << 1 | 1]);
}
}
void get(int node, int left, int right, int qleft, int qright, int& out)
{
if ((qleft <= left) && (right <= qright))
out = max(out, data[node]);
else
{
int middle = (left + right) / 2;
if (qleft <= middle)
get(node << 1, left, middle, qleft, qright, out);
if (qright > middle)
get(node << 1 | 1, middle + 1, right, qleft, qright, out);
}
}
int data[4 * MAX_N];
} it;
int n, m;
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
int x;
fin >> x;
it.set(1, 1, n, i, x);
}
for (int i = 1; i <= m; ++i)
{
int t, x, y, z = 0;
fin >> t >> x >> y;
if (t == 0)
{
it.get(1, 1, n, x, y, z);
fout << z << '\n';
}
else
it.set(1, 1, n, x, y);
}
fin.close();
fout.close();
return 0;
}