#include<stdio.h>
#define NMAX 100010
int q,c,m1,m2,x[NMAX],a[NMAX*2+1],rez,i,j,n,m,k,l,b,s,t;
int max(int a,int b)
{
if (a>b)
return a;
return b;
}
int start(int k,int s,int t)
{
if (s==t)
{
a[k]=x[s];
return x[s];
}
m1=start(2*k,s,(s+t)/2);
m2=start(2*k+1,(s+t)/2+1,t);
a[k]=max(m1,m2);
}
void modify(int k,int s,int t)
{
if (s==t)
{
a[k]=c;
return ;
}
int q=(s+t)/2;
if (b<=q)
modify(2*k,s,q);
else
modify(2*k+1,q+1,t);
a[k]=max(a[2*k],a[2*k+1]);
}
void query(int k,int s,int t)
{
if (s>=b&&t<=c)
{
if (rez<a[k])
rez=a[k];
return;
}
int q=(s+t)/2;
if (b<=q)
query(2*k,s,q);
if (q<c)
query(2*k+1,q+1,t);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
scanf("%d",&x[i]);
a[1]=start(1,1,n);
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&k,&b,&c);
if (k==1)
modify(1,1,n);
else
{
rez=-1;
query(1,1,n);
printf("%d\n",rez);
}
}
return 0;
}