//arbore de intervale
# include <stdio.h>
# define nmax 1000001
# define FIN "arbint.in"
# define FOUT "arbint.out"
long m,n,i,a,b,c,H[4*nmax],x,rez;
long max(long a, long b)
{
if (a>b) return a;
else return b;
}
void update(long c,long x,long y,long poz,long val)
{
long mij;
if (x==y) H[c]=val;
else
{
mij=(x+y)>> 1;
if (poz<=mij) update(c << 1,x,mij,poz,val);
else update(c << 1 | 1,mij+1,y,poz,val);
H[c]=max(H[c << 1],H[c << 1 | 1]);
}
}
void query(long c,long li,long lf)
{
long mij;
if (a<=li && lf<=b)
{
rez=max(H[c],rez);
return;
}
mij=(li+lf) >> 1;
if (a<=mij) query(c << 1,li,mij);
if (b>mij) query(c << 1 | 1,mij+1,lf);
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%ld %ld",&n,&m);
for (i=1; i<=n; i++)
{
scanf("%ld",&x);
update(1,1,n,i,x);
}
for (i=1; i<=m; i++)
{
scanf("%ld %ld %ld",&c,&a,&b);
if (c==0)
{
rez=0;
query(1,1,n);
printf("%ld\n",rez);
}
else update(1,1,n,a,b);
}
return 0;
}