#include<stdio.h>
int n,m,max;
#define N 100005
int t[3*N];
int val,poz,x,y,z,a,b;
const int inf=-(1<<30);
void actual(int p,int u,int i)
{
if(p==u)
{
t[i]=val;
return;
}
int m=(p+u)>>1;
if(poz<=m)
actual(p,m,i<<1);
else
actual(m+1,u,(i<<1)+1);
if(t[i<<1]>t[(i<<1)+1])
t[i]=t[i<<1];
else
t[i]=t[(i<<1)+1];
}
void maxim(int p,int u,int i)
{
if(a<=p && u<=b)
{
if(t[i]>max)
max=t[i];
return;
}
int m=(p+u)>>1;
if(a<=m)
maxim(p,m,i<<1);
if(m<b)
maxim(m+1,u,(i<<1)+1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(poz=1; poz<=n; poz++)
{
scanf("%d",&val);
actual(1,n,1);
}
for(; m; m--)
{
scanf("%d%d%d",&x,&y,&z);
if(x)
{
poz=y;
val=z;
actual(1,n,1);
}
else
{
max=inf;
a=y;
b=z;
maxim(1,n,1);
printf("%d\n",max);
}
}
return 0;
}