#include <fstream>
using namespace std;
const int Nmax = 1000000;
int a[Nmax + 1], aint[4 * Nmax + 1];
void build(int node, int l, int r)
{
if (l == r)
{
aint[node] = a[l];
}
else
{
int mid = (l + r) / 2;
build(2 * node, l, mid);
build(2 * node + 1, mid + 1, r);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
int query(int node, int l, int r, int p, int q)
{
if (p > q)
{
return 0;
}
else if (p == l && q == r)
{
return aint[node];
}
int mid = (l + r) / 2;
return max(query(2 * node, l, mid, p, min(q, mid)), query(2 * node + 1, mid + 1, r, max(p, mid + 1), q));
}
void update(int node, int l, int r, int poz, int k)
{
if (l == r)
{
aint[node] = k;
}
else
{
int mid = (l + r) / 2;
if (poz <= mid)
{
update(2 * node, l, mid, poz, k);
}
else
{
update(2 * node + 1, mid + 1, r, poz, k);
}
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> a[i];
}
build(1, 1, n);
while (m--)
{
int t, l, r;
fin >> t >> l >> r;
if (t == 0)
{
fout << query(1, 1, n, l, r) << "\n";
}
else
{
update(1, 1, n, l, r);
}
}
return 0;
}