#include <fstream>
#define maxim(x, y) x > y ? x : y
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int arbint[(1 << 18)];
void actualizare(int nod, int st, int dr, int a, int b, int val)
{
if(a <= st && dr <= b)
{
arbint[nod] = val;
return;
}
int mij = (st + dr) >> 1;
if(a <= mij)
actualizare(nod << 1, st, mij, a, b, val);
if(mij + 1 <= b)
actualizare((nod << 1) + 1, mij + 1, dr, a, b, val);
arbint[nod] = maxim(arbint[nod << 1], arbint[(nod << 1) + 1]);
}
int interogare(int nod, int st, int dr, int a, int b)
{
if(a <= st && dr <= b)
return arbint[nod];
int mij = (st + dr) >> 1;
int rez = 0;
if(a <= mij)
rez = maxim(rez, interogare(nod << 1, st, mij, a, b));
if(mij + 1 <= b)
rez = maxim(rez, interogare((nod << 1) + 1, mij + 1, dr, a, b));
return rez;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int val;
in >> val;
actualizare(1, 1, n, i, i, val);
}
for(int i = 1; i <= m; i++)
{
int op, a, b;
in >> op >> a >> b;
switch(op)
{
case 0:
out << interogare(1, 1, n, a, b) << '\n';
break;
case 1:
actualizare(1, 1, n, a, a, b);
break;
}
}
return 0;
}