#include <fstream>
#define NMAX 100005
using namespace std;
int v[NMAX], arb[3*NMAX], i,n,m,car,a,b,ans,aux;
void update(const int &st, const int &dr, const int &poz, const int &nod )
{
if(st==dr)
{
arb[nod]=v[poz];
return;
}
int sfiu = (nod<<1);
int dfiu = ((nod<<1)+1);
int mij = ((st+dr)>>1);
if(poz<=mij) update(st,mij,poz,sfiu);
if(poz>mij) update(mij+1,dr,poz,dfiu);
arb[nod] = max(arb[sfiu], arb[dfiu]);
}
int querry(const int &st, const int &dr, const int &st1, const int &dr1, const int &nod)
{
if(st==st1 && dr==dr1)
return arb[nod];
int sfiu=(nod<<1);
int dfiu=((nod<<1)|1);
int mij=((st+dr)>>1);
if(dr1<=mij)
return querry(st,mij,st1,dr1,sfiu);
if(st1>mij)
return querry(mij+1,dr,st1,dr1,dfiu);
return max(querry(st,mij,st1,mij,sfiu), querry(mij+1,dr,mij+1,dr1,dfiu));
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>v[i];
update(1,n,i,1);
}
/*for(i=1;i<=3*n;i++)
g<<arb[i];
*/
for(i=1;i<=n;i++)
{
f>>car>>a>>b;
if(car==0)
{
ans=querry(1,n,a,b,1);
g<<ans<<"\n";
}
if(car==1)
{
v[a]=b;
update(1,n,a,1);
}
}
}