/*#include <algorithm>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M, Aint[400102], tip, val, start, finish, poz, maxim;
inline void update(int nod, int st, int dr, int poz, int val)
{
if (st==dr) { Aint[poz]=val; return; }
int mij=(st+dr)/2, ls=nod*2, rs=ls+1;
if (poz<=mij) update(ls, st, mij, poz, val);
else update(rs, mij+1, dr, poz, val);
Aint[nod]=max(Aint[nod*2], Aint[nod*2+1]);
}
inline void query(int nod, int st, int dr)
{
if (st>=start && dr<=finish)
{
if (maxim<Aint[nod]) maxim=Aint[nod];
return;
}
if (st!=dr)
{
int mij=(st+dr)/2, ls=nod*2, rs=ls+1;
if (start<=mij) query(ls, st, mij);
if (mij<finish) query(rs, mij+1, dr);
}
}
int main()
{
f>>N>>M;
for (int i=1; i<=N; ++i)
f>>val, poz=i, update(1, 1, N, i, val);
for (int i=1; i<=M; ++i)
{
f>>tip;
if (tip) f>>poz>>val, update(1, 1, N, poz, val);
else
{
f>>start>>finish; maxim=-1;
query(1, 1, N); g<<maxim<<'\n';
}
}
return 0;
}*/
#include <fstream>
#include <algorithm>
#define MaxN 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M, arb[4*MaxN+100], tip, pos, val, maxim, start, finish;
inline void update(int nod, int st, int dr)
{
if (st==dr) { arb[nod]=val; return; }
else
{
int mij=(st+dr)>>1;
if (pos<=mij) update(nod<<1, st, mij);
else update((nod<<1)+1, mij+1, dr);
if (arb[nod<<1]>arb[(nod<<1)+1]) arb[nod]=arb[nod<<1];
else arb[nod]=arb[(nod<<1)+1];
}
}
inline void query(int nod, int st, int dr)
{
if (start<=st && dr<=finish)
{
if (maxim<arb[nod]) maxim=arb[nod];
return;
}
else if (st!=dr)
{
int mij=(st+dr)>>1;
if (start<=mij) query(nod<<1, st, mij);
if (mij<finish) query((nod<<1)+1, mij+1, dr);
}
}
int main()
{
f>>N>>M;
for (int i=1; i<=N; ++i)
{
f>>val;
update(1, 1, N);
}
for (int i=1; i<=M; ++i)
{
f>>tip;
if (tip) f>>pos>>val, update(1, 1, N);
else
{
maxim=-1; f>>start>>finish;
query(1, 1, N); g<<maxim<<'\n';
}
}
return 0;
}