#include <stdio.h>
const int maxn=100001;
int i,N,M,x,a,b,max,ArbInt[5*maxn];
int maxim(int a, int b)
{
if(a>b) return a;
return b;
}
void update(int k, int st, int dr)
{
if(st==dr)
{
ArbInt[k]=b;
return;
}
int m=st+(dr-st)/2;
if(a<=m) update(2*k,st,m);
else update(2*k+1,m+1,dr);
ArbInt[k]=maxim(ArbInt[2*k],ArbInt[2*k+1]);
}
void caut(int k, int st, int dr)
{
if(a<=st && dr<=b)
{
if(ArbInt[k]>max) max=ArbInt[k];
return;
}
int m=st+(dr-st)/2;
if(a<=m) caut(2*k,st,m); // a E {st,m}
if(m<b) caut(2*k+1,m+1,dr); // b E {m+1,dr}
}
void citire()
{
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
{
scanf("%d",&x);
a=i; b=x;
update(1,1,N);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
for(i=1;i<=M;i++)
{
scanf("%d %d %d",&x,&a,&b);
if(x==0)
{
max=-1;
caut(1,1,N);
printf("%d\n",max);
}
if (x==1)
{
update(1,1,N);
}
}
}