#include <iostream>
#include <stdio.h>
using namespace std;
FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");
int a,b,x,mn=2000000000,mx=0,v[50000],i,n,m,s,sf,val,pos,maxim;
int mxm (int a ,int b)
{
if(a>b) return a; else return b;
}
void query(int nod, int l, int r)
{
if ( s <= l && r <= sf )
{
if ( maxim < v[nod] ) maxim = v[nod];
return;
}
int m = (l+r)/2;
if ( s <= m ) query(2*nod,l,m);
if ( m < sf ) query(2*nod+1,m+1,r);
}
void update(int nod, int l,int r)
{
int m=(l+r)/2;
if(l==r) {v[nod]=val;return;}
else
{
if (pos<=m) update(2*nod,l,m);else update(2*nod+1,m+1,r);
}
v[nod] =mxm(v[2*nod],v[2*nod+1]);
}
int main()
{
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
val=x;
pos=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
fscanf(f,"%d%d%d",&x,&a,&b);
if(x==1)
{
pos=a;
val=b;
update(1,1,n);
} else
{
maxim = -1;
s=a,sf=b;
query(1,1,n);
fprintf(g,"%d\n", maxim);
}
}
fclose(g);
return 0;
}