#include <fstream>
#define Nmax 100011
using namespace std;
int v[Nmax],aint[2*Nmax],n,m;
void update (int st , int dr , int pos , int nod)
{
if (st==dr)
{
aint[nod]=v[pos];
}
else
{
int mij=(st+dr)/2;
if (pos<=mij)
{
update(st , mij ,pos ,nod*2);
}
else
{
update (mij+1,dr,pos ,nod *2+1);
}
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int query (int st , int dr , int p1 , int p2 , int nod)
{
if (st==p1 && dr==p2)
{
return aint[nod];
}
else
{
int mij =(st+dr)/2;
if (p2<=mij)
{
return query (st , mij , p1 , p2 , nod*2);
}
else
{
if (p1>mij)
{
return query(1+mij,dr,p1,p2,2*nod+1);
}
else
{
return max ( query(st , mij , p1 , mij , 2*nod) , query(mij+1 , dr , mij+1 , p2 ,2*nod+1) );
}
}
}
}
int main()
{
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
fin>>n>>m;
for (int i=1;i<=n;++i)
{
fin>>v[i];
update (1 , n , i , 1);
}
for (int j=1; j<=m;++j)
{
int p,a,b;
fin>>p>>a>>b;
if (p==1)
{
v[a]=b;
update (1 , n , a , 1);
}
else
{
fout<<query (1 , n , a , b , 1)<<"\n";
}
}
}