#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int n, m, x, cer, a, b;
int arb[100000 * 4 + 2];
void update (int nod, int a, int b, int poz, int val)
{
int mij = (a + b) / 2;
if (a == b) arb[nod] = val;
else
{
if (poz <= mij) update(2 * nod, a, mij, poz, val);
else update(2 * nod + 1, mij + 1, b, poz, val);
arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
}
int query (int nod, int a, int b, int qa, int qb)
{
int m1 = 0, m2 = 0, mij;
if (qa <= a && b <= qb) return arb[nod];
mij = (a + b) / 2;
if (qa <= mij) m1 = query (2 * nod, a, mij, qa, qb);
if (qb > mij) m2 = query(2 * nod + 1, mij + 1, b, qa, qb);
return max(m1,m2);
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f >> x;
update(1,1,n,i,x);
}
for (int i = 1; i <= m; i++)
{
f >> cer;
if (cer == 0)
{
f >> a >> b;
g << query(1,1,n,a,b) << '\n';
}
else
{
f >> a >> b;
update(1,1,n,a,b);
}
}
return 0;
}