#include <cstdio>
#include <cstdlib>
FILE*f=fopen("arbint.in","r");
FILE*g=fopen("arbint.out","w");
int n,arb[300000],m,val,pos,maxim,a,b;
int max(int a,int b)
{
if (a>b)
return a;
return b;
}
void update(int nod,int st,int dr)
{
int mij;
if (st==dr)
{
arb[nod]=val;
return;}
mij=(st+dr)/2;
if (pos<=mij)
update(2*nod,st,mij);
else
update(2*nod+1,mij+1,dr);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
void query(int nod,int st,int dr)
{
int mij;
if ((a<=st) && (dr<=b))
{
if (maxim<arb[nod])
maxim=arb[nod];
return;}
mij=(st+dr)/2;
if (a<=mij)
query(2*nod,st,mij);
if (mij<b)
query(2*nod+1,mij+1,dr);
}
int main()
{
int x,i,tip;
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
pos=i;val=x;
update(1,1,n);
}
for (i=1;i<=m;i++)
{
fscanf(f,"%d",&tip);
switch(tip){
case 0:{fscanf(f,"%d%d",&a,&b);maxim=-1;query(1,1,n);fprintf(g,"%d \n",maxim);break;}
case 1:{fscanf(f,"%d%d",&a,&b);pos=a;val=b;update(1,1,n);break;}
}
}
return 0;
}