#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int arb[(1 << 18)];
inline int maxim(int x, int y)
{
return x > y ? x : y;
}
void actualizeaza(int nod, int st, int dr, int poz, int val)
{
if(poz <= st && dr <= poz)
{
arb[nod] = val;
return;
}
int mij = (st + dr) >> 1;
if(poz <= mij)
actualizeaza((nod << 1), st, mij, poz, val);
if(mij + 1 <= poz)
actualizeaza((nod << 1) + 1, mij + 1, dr, poz, val);
arb[nod] = maxim(arb[2 * nod], arb[2 * nod + 1]);
}
int interogare(int nod, int st, int dr, int x, int y)
{
if(x <= st && dr <= y)
return arb[nod];
int mij = (st + dr) >> 1;
int rez = 0;
if(x <= mij)
rez = maxim(rez, interogare((nod << 1), st, mij, x, y));
if(mij + 1 <= y)
rez = maxim(rez, interogare((nod << 1) + 1, mij + 1, dr, x, y));
return rez;
}
void citire()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int val;
in >> val;
actualizeaza(1, 1, n, i, val);
}
}
int main()
{
citire();
for(int i = 1; i <= m; i++)
{
int tip, a, b;
in >> tip >> a >> b;
if(tip == 0)
out << interogare(1, 1, n, a, b) << '\n';
else
actualizeaza(1, 1, n, a, b);
}
return 0;
}