#include<fstream>
#define NMAX 100010
#define MMAX 200010
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int x[NMAX], a[MMAX], pz[NMAX], n, m, mx;
void Citeste()
{
int i;
f>>n>>m;
for (i=1; i<=n; ++i) f>>x[i];
}
void Formeaza(int st, int dr, int nod)
{
int mij=(st+dr)/2;
if (st==dr) a[nod]=x[dr], pz[dr]=nod;
else
{
Formeaza(st, mij, nod*2);
Formeaza(mij+1, dr, nod*2+1);
a[nod]=max(a[nod*2], a[(nod*2)+1]);
}
}
void Upgrade(int xx, int yy)
{
int j;
x[xx]=yy;
a[pz[xx]]=yy;
j=pz[xx]/2;
while (j>0) a[j]=max(a[j*2], a[(j*2)+1]), j/=2;
}
void Query(int st, int dr, int xx, int yy, int nod)
{
int mij=(st+dr)/2;
if (st==dr && xx<=st && yy>=st) mx=max(mx, a[nod]);
else
{
if (xx<=mij) Query(st, mij, xx, yy, 2*nod);
if (yy>mij) Query(mij+1, dr, xx, yy, (2*nod)+1);
}
}
void Solve()
{
int op, xx, yy, i;
for (i=1; i<=m; ++i)
{
f>>op>>xx>>yy;
if (op) Upgrade(xx, yy);
else
{
mx=0;
Query(1, n, xx, yy, 1);
g<<mx<<"\n";
}
}
}
int main()
{
Citeste();
Formeaza(1, n, 1);
Solve();
f.close();
g.close();
return 0;
}