#include <fstream>
using namespace std;
int n, m, x, v[400100];
int op, a, b, maxim;
inline MAXIM(int a, int b)
{
if(a > b) return a;
return b;
}
void Update(int nod, int st, int dr, int poz, int x)
{
if(st == dr) v[nod] = x;
else
{
int m = ((st + dr) >> 1);
if(poz <= m) Update(2 * nod, st, m, poz, x);
else Update(2 * nod + 1, m + 1, dr, poz, x);
v[nod] = MAXIM(v[2 * nod], v[2 *nod + 1]);
}
}
void Query(int nod, int st, int dr)
{
if(a <= st && dr <= b)
{
if(v[nod] > maxim) maxim = v[nod];
}
else
{
int m = ((st + dr) >> 1);
if(m >= a) Query(2 * nod, st, m);
if(m < b) Query(2 * nod + 1, m + 1, dr);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
for(int i = 1; i <= n; ++i)
{
f >> x;
Update(1, 1, n, i, x);
}
for(int i = 1; i <= m; ++i)
{
f >> op >> a >> b;
if(op == 1) Update(1, 1, n, a, b);
else
{
maxim = -1;
Query(1, 1, n);
g << maxim << '\n';
}
}
return 0;
}