#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, int pos, int val)
{
if (st==dr) { arb[nod]=val; return; }
else
{
int mij=(st+dr)>>1;
if (pos<=mij) update(nod<<1, st, mij, pos, val);
else update((nod<<1)+1, mij+1, dr, pos, val);
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, int start, int finish)
{
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, start, finish);
if (mij<finish) query((nod<<1)+1, mij+1, dr, start, finish);
}
}
int main()
{
f>>N>>M;
for (int i=1; i<=N; ++i)
{
f>>val;
update(1, 1, N, i, val);
}
for (int i=1; i<=M; ++i)
{
f>>tip;
if (tip) f>>pos>>val, update(1, 1, N, pos, val);
else
{
maxim=-1; f>>start>>finish;
query(1, 1, N, start, finish); g<<maxim<<'\n';
}
}
return 0;
}