#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100001;
int st[4 * NMAX];
void updateVal(int crtIndex, int left, int right, int &pos, int &val)
{
if (left == right)
{
st[crtIndex] = val;
return;
}
int m = (left + right) >> 1;
if (pos <= m)
updateVal(2 * crtIndex, left, m, pos, val);
else
updateVal(2 * crtIndex + 1, m + 1, right, pos, val);
st[crtIndex] = max(st[2 * crtIndex], st[2 * crtIndex + 1]);
}
void queryInterval(int currentPos, int currentLeft, int currentRight, int &queryIntervalLeft, int &queryIntervalRight, int &maxVal)
{
if (queryIntervalLeft <= currentLeft && currentRight <= queryIntervalRight)
{
maxVal = max(maxVal, st[currentPos]);
return;
}
int m = (currentLeft + currentRight) >> 1;
if (queryIntervalLeft <= m)
queryInterval(2 * currentPos, currentLeft, m, queryIntervalLeft, queryIntervalRight, maxVal);
if (m < queryIntervalRight)
queryInterval(2 * currentPos + 1, m + 1, currentRight, queryIntervalLeft, queryIntervalRight, maxVal);
}
int main()
{
int a, n, q, b;
fin >> n >> q;
for (int i = 1; i <= n; ++i)
{
fin >> a;
updateVal(1, 1, n, i, a);
}
while (q--)
{
char x;
fin >> x >> a >> b;
if (x == '1')
updateVal(1, 1, n, a, b);
else
{
int maxi = 0;
queryInterval(1, 1, n, a, b, maxi);
fout << maxi << "\n";
}
}
return 0;
}