#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
constexpr int NMAX = 1e5 + 5;
int N, Q;
int arb[4*NMAX];
void Update (int nod, int a, int b, int poz, int val)
{
if (a == b)
{
arb[nod] = val;
return;
}
int mij = (a + b) / 2;
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)
{
if (qa <= a && b <= qb) return arb[nod];
int mij = (a + b) / 2;
int ans_1 = 0, ans_2 = 0;
if (qa <= mij) ans_1 = query(2*nod, a, mij, qa, qb);
if (mij < qb) ans_2 = query(2*nod+1, mij+1, b, qa, qb);
return max(ans_1, ans_2);
}
void Read ()
{
f >> N >> Q;
for (int i = 1; i <= N; ++i)
{
int x;
f >> x;
Update(1, 1, N, i, x);
}
}
void Solve ()
{
for (int i = 1; i <= Q; ++i)
{
int tip, a, b;
f >> tip >> a >> b;
if (tip == 0) g << query(1, 1, N, a, b) << '\n';
else Update(1, 1, N, a, b);
}
}
int main ()
{
Read();
Solve();
return 0;
}