#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int arb[400007];
void arbintUpdate(int nod, int st, int dr, int pz, int val)
{
if(st == dr)
arb[nod] = val;
else
{
int mid = (st + dr) / 2;
if(pz <= mid)
arbintUpdate(nod * 2, st, mid, pz, val);
else
arbintUpdate(nod * 2 + 1, mid + 1, dr, pz ,val);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
}
int arbintQuery(int nod, int st, int dr, int left, int right)
{
if(left <= st && dr <= right)
return arb[nod];
else
{
int mid = (st + dr) / 2,
s = 0;
if(left <= mid)
s = max(s, arbintQuery(nod * 2, st, mid, left, right));
if(mid < right)
s = max(s, arbintQuery(nod * 2, mid + 1, dr, left, right));
return s;
}
}
int main()
{
int n, m, tp, a, b;
in >> n >> m;
for(int i = 1; i <= n; ++i)
{
in >> a;
arbintUpdate(1, 1, n, i, a);
}
for(int i = 1; i <= m; ++i)
{
in >> tp >> a >> b;
if(tp == 0)
out << arbintQuery(1, 1, n, a ,b);
else
arbintUpdate(1, 1, n, a, b);
}
}