#include <fstream>
#include <algorithm>
using namespace std;
int n, m;
int v[100001];
int ai[100001];
ifstream f ("arbint.in");
ofstream g ("arbint.out");
void build(int nod,int a,int b)
{
if (a == b)
ai[nod] = v[a];
else
{
int mij = (a + b) / 2;
build(2 * nod, a, mij);
build(2 * nod + 1, mij + 1, b);
ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
}
}
void update(int nod, int val, int pos, int x, int y)
{
if (x == y)
ai[nod] = val;
else
{
int mij = (x + y) / 2;
if (pos > mij)
update(2*nod+1, val, pos, mij + 1, y);
else update(2*nod, val, pos, x, mij);
ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
}
}
int query(int nod, int a, int b, int x, int y)
{
if (a <= x && y <= b)
return ai[nod];
else
{
int mij = (x + y) / 2;
int nr1 = 0, nr2 = 0;
if (a <= mij)
nr1 = query(2 * nod, a, b, x, mij);
if (b > mij)
nr2 = query(2 * nod + 1, a, b, mij + 1, y);
return max(nr1, nr2);
}
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++)
f >> v[i];
build(1, 1, n);
for (int i = 1; i <= m; i++)
{
int c, a, b;
f >> c >> a >> b;
if (c == 1)
update(1, b, a, 1, n);
else
g << query(1, a, b, 1, n)<<"\n";
}
return 0;
}