#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int arbint[1 << 18];
inline int maxim(int a, int b)
{
return a > b ? a : b;
}
inline 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]);
}
inline 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 bun = 0;
if(a <= mij)
bun = maxim(bun, interogare(nod << 1, st, mij, a, b));
if(mij + 1 <= b)
bun = maxim(bun, interogare((nod << 1) + 1, mij + 1, dr, a, b));
return bun;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
actualizare(1, 1, n, i, i, x);
}
while(m--)
{
int t, a, b;
in >> t >> a >> b;
if(t)
actualizare(1, 1, n, a, a, b);
else
out << interogare(1, 1, n, a, b) << '\n';
}
return 0;
}