#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int arb[1000001], maxx, i, n, q, tip, a, b, poz, val;
void actualizare(int in, int i, int st, int dr, int val)
{
if(st==dr)
{
arb[in]=val;
return;
}
int mij=(st+dr)/2;
if(mij>=i)
actualizare(in*2, i, st, mij, val);
else actualizare(in*2+1, i, mij+1, dr, val);
arb[in]=max(arb[in*2], arb[in*2+1]);
}
int raspuns(int in, int st, int dr, int a, int b)
{
if(a<=st&&dr<=b)
return arb[in];
int rez1=0, rez2=0;
int mij=(dr+st)/2;
if(!(b<st||a>mij))
rez1=raspuns(in*2, st, mij, a, b);
if(!(b<mij+1||a>dr))
rez2=raspuns(in*2+1, mij+1, dr, a, b);
int rez=max(rez1, rez2);
return rez;
}
int main()
{
fin >> n >> q;
for(i=1;i<=n;i++)
{
fin >> val;
actualizare(1, i, 1, n, val);
}
for(i=1;i<=q;i++)
{
fin >> tip;
if(tip==1)
{
fin >> poz >> val;
actualizare(1, poz, 1, n, val);
}
else
{
fin >> a >> b;
fout << raspuns(1, 1, n, a, b) << '\n';
}
}
return 0;
}