#include <fstream>
#include <algorithm>
using namespace std;
int a[525000], n, n1;
void Update(int p, int x)
{
int k;
a[p] = x;
while (p >= 1)
{
if (p % 2 == 1) p--;
k = p / 2;
a[k] = max(a[p], a[p + 1]);
p = k;
}
}
// care este maximul din intervalul [x, y]
int Query(int p, int x, int y, int st, int dr)
{
int m;
if (x == st && y == dr)
return a[p];
else
{
m = (st + dr) / 2;
if (y <= m) // [x, y] inclus in [st, m]
return Query(2 * p, x, y, st, m);
else if (m + 1 <= x) // [x,y] inclus in [m+1, dr]
return Query(2 * p + 1, x, y, m + 1, dr);
else // x <= m < y
return max(Query(2 * p, x, m, st, m), Query(2*p+1, m + 1, y, m+1, dr));
}
}
void Citire()
{
int i, m, k, op, x, y;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin >> k >> m;
n = 1;
while (n < k)
n *= 2;
n1 = 2 * n - 1;
for (i = n; i < n + k; i++)
fin >> a[i];
for (i = n - 1; i >= 1; --i)
a[i] = max(a[2 * i], a[2 * i + 1]);
for (i = 1; i <= m; i++)
{
fin >> op >> x >> y;
if (op == 0)
fout << Query(1, x, y, 1, n) << "\n";
else
Update(n + x - 1, y);
}
fin.close();
fout.close();
}
int main()
{
Citire();
return 0;
}