#include <fstream>
#define NMAX 100001
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, arb[4*NMAX+66], pos, val, maxim, start, finish;
void update(int nod, int st, int dr);
void query(int nod, int st, int dr);
int main()
{
in >> n >> m;
for(int x, i = 1; i <= n; ++i)
{
in >> x;
pos = i, val = x;
update(1, 1, n);
}
for(int tip, x, y, i = 1; i <= m; ++i)
{
in >> tip >> x >> y;
if(tip)
{
pos = x, val = y;
update(1, 1, n);
}
else
{
maxim = -1;
start = x, finish = y;
query(1, 1, n);
out << maxim << '\n';
}
}
in.close(), out.close();
return 0;
}
void update(int nod, int st, int dr)
{
if(st == dr)
{
arb[nod] = val;
return;
}
int m = (st+dr) >> 1;
if(pos <= m) update((nod<<1), st, m);
else update((nod<<1) +1, m+1, dr);
arb[nod] = max(arb[(nod<<1)], arb[(nod<<1) +1]);
}
void query(int nod, int st, int dr)
{
if(start <= st && dr <= finish)
{
maxim = max(maxim, arb[nod]);
return;
}
int m = (st+dr) >> 1;
if(start <= m) query((nod<<1), st, m);
if(m < finish) query((nod<<1) +1, m+1, dr);
}