#include<fstream>
#define NMAX 100010
#define ARBMAX 270010
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, A[NMAX], arb[ARBMAX];
void Citeste()
{
int i;
f>>n>>m;
for (i=1; i<=n; ++i) f>>A[i];
}
void Formeaza(int st, int dr, int pz)
{
int mij=(st+dr)/2;
if (st==dr) arb[pz]=A[st];
else
{
Formeaza(st, mij, pz*2);
Formeaza(mij+1, dr, pz*2+1);
arb[pz]=max(arb[pz*2], arb[pz*2+1]);
}
}
int maxim(int x, int y, int st, int dr, int cr)
{
int sol, mij=(st+dr)/2, M1, M2;
if ( (y<st || x>dr) ) return -1;
else
if (x<=st && y>=dr) return arb[cr];
else
{
M1=maxim(x, y, st, mij, cr*2);
M2=maxim(x, y, mij+1, dr, cr*2+1);
sol=max(M1, M2);
return sol;
}
}
void Upgrade(int pz, int val, int st, int dr, int cr)
{
int mij=(st+dr)/2;
if (st==dr)
{
A[pz]=val;
arb[cr]=val;
}
else
{
if (pz>=st && pz<=mij) Upgrade(pz, val, st, mij, cr*2);
else Upgrade(pz, val, mij+1, dr, cr*2+1);
arb[cr]=max(arb[cr*2], arb[cr*2+1]);
}
}
void Solve()
{
int i, op, x, y;
for (i=1; i<=m; ++i)
{
f>>op>>x>>y;
if (!op) g<<maxim(x, y, 1, n, 1)<<"\n";
else Upgrade(x, y, 1, n, 1);
}
}
int main()
{
Citeste();
Formeaza(1, n, 1);
Solve();
f.close();
g.close();
return 0;
}