#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
#define NMAX 400001
int n, m, mx, a[NMAX];
void add(int nod, int st, int dr, int pos, int val)
{
if (dr == st)
{
a[nod] = val;
return;
}
int mijl = (st + dr)/2;
if (pos <= mijl)add (2 * nod, st, mijl, pos, val);
else add(2 * nod + 1, mijl + 1, dr, pos, val);
a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}
void query(int nod, int st, int dr, int inc, int fnl)
{
if (st >= inc && dr <= fnl)
{
mx = max(mx, a[nod]);
return;
}
int mijl = (st + dr)/2;
if(mijl >= inc)query(2 * nod, st, mijl, inc, fnl);
if (mijl < fnl)query(2 * nod + 1, mijl + 1, dr, inc, fnl);
}
int main()
{
int x, y, c;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> x;
add(1, 1, n, i, x);
}
for (int i = 1; i <= m; i++)
{
fin >> c >> x >> y;
if (c == 1)add(1, 1, n, x, y);
else
{
mx = -1;
query(1, 1, n, x, y);
fout << mx << '\n';
}
}
return 0;
}