#include<stdio.h>
#define max(a,b) (a>b)?a:b
#define Nmax 100010
int ar[4*Nmax],a,b,n,op,m,maxl;
void update(int val,int poz,int nod, int st,int dr)
{
if(st==dr)
{
ar[nod]=val;
return;
}
int mij;
mij=(st+dr)/2;
if(poz<=mij)
update(val,poz,2*nod,st,mij);
else
update(val,poz,2*nod+1,mij+1,dr);
ar[nod]=max(ar[2*nod],ar[2*nod+1]);
}
void query(int nod, int st,int dr, int a, int b)
{
if(st>=a && dr<=b)
{
if(maxl<ar[nod])
maxl=ar[nod];
return;
}
int mij=(st+dr)/2;
if(a<=mij)
query(2*nod,st,mij,a,b);
if(b>mij)
query(2*nod+1,mij+1,dr,a,b);
}
int main()
{
int x;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
update(x,i,1,1,n);
}
for(int j=1;j<=m;j++)
{ scanf("%d%d%d",&op,&a,&b);
if(op==0)
{
maxl=0;
query(1,1,n,a,b);//in loc de 1,n trebuie 1 si ultima pozitie din interval.
printf("%d\n",maxl);
}
else
{
update(b,a,1,1,n);
}
}
return 0;
}