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