#include <stdio.h>
int x,y,c,n,m,i;
int arb[250000];
inline int max(int x,int y)
{
if(x<y) return y;
else return x;
}
inline void add(int nod,int L,int R)
{
int M;
if(L==x&&x==R) arb[nod]=y;
else
{
M=(L+R)/2;
if(x<=M) add(2*nod,L,M);
else
if(M<x) add(2*nod+1,M+1,R);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
}
inline int src(int nod,int L,int R)
{
int M,aux1=0,aux2=0;
if(x<=L&&R<=y) return arb[nod];
else
{
M=(L+R)/2;
if(x<=M) aux1=src(2*nod,L,M);
if(M<y) aux2=src(2*nod+1,M+1,R);
return max(aux1,aux2);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(x=1;x<=n;x++)
{
scanf("%d",&y);
add(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&c,&x,&y);
switch(c)
{
case 0:
printf("%d\n",src(1,1,n));
break;
case 1:
add(1,1,n);
break;
}
}
return 0;
}