#include <stdio.h>
#define N 100005
int m,n,q,a,b,i,k,x,sol;
int arb[4*N];
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void urca(int nod)
{
if(nod!=0)
{
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
urca(nod/2);
}
}
void schimba(int st,int dr,int nod)
{
if(st==dr)
{
arb[nod]=x;
urca(nod/2);
return;
}
int m=(st+dr)/2;
if(k<=m)
schimba(st,m,2*nod);
else
schimba(m+1,dr,2*nod+1);
}
void query(int st,int dr,int nod)
{
if(st>=a && dr<=b)
{
sol=max(sol,arb[nod]);
return;
}
int m=(st+dr)/2;//,sol=0;
if(a<=m)
//sol=max(sol,query(st,m,2*nod));
query(st,m,2*nod);
if(b>m)
//sol=max(sol,query(m+1,dr,2*nod+1));
query(m+1,dr,2*nod+1);
//wreturn sol;
}
int main()
{
FILE *f1,*f2;
f1=fopen("arbint.in","r");
f2=fopen("arbint.out","w");
fscanf(f1,"%d%d",&n,&m);
for(i=0;i<n;i++)
{
fscanf(f1,"%d",&x);
k=i+1;
schimba(1,n,1);
}
for(i=0;i<m;i++)
{
fscanf(f1,"%d%d%d",&q,&a,&b);
if(q==0)
{
sol=0;
query(1,n,1);
fprintf(f2,"%d\n",sol);
}
else
{
k=a;
x=b;
schimba(1,n,1);
}
}
return 0;
}