#include <stdio.h>
#define max(a,b) ((a)>(b) ? (a):(b))
int a[100009],t[400009],n,m,i,x,y,z;
void build(int * a,int v,int st,int dr)
{
if (st==dr)
t[v]=a[st]; else
{
int tmp=(st+dr)/2;
build(a,2*v+1,st,tmp);
build(a,2*v+2,tmp+1,dr);
t[v]=max(t[2*v+1],t[2*v+2]);
}
}
int q(int v,int st,int dr,int l,int r)
{
if (st==l && dr==r)
return t[v];
int tmp=(st+dr)/2;
if (l>tmp)
return q(2*v+2,tmp+1,dr,l,r); else
if (r<=tmp)
return q(2*v+1,st,tmp,l,r); else
return max(q(2*v+1,st,tmp,l,tmp),q(2*v+2,tmp+1,dr,tmp+1,r));
}
void up(int v,int index,int value,int st,int dr)
{
if (st==dr)
t[v]=value; else
{
int tmp=(st+dr)/2;
if (index<=tmp)
up(2*v+1,index,value,st,tmp);
else up(2*v+2,index,value,tmp+1,dr);
t[v]=max(t[2*v+1],t[2*v+2]);
}
}
int main()
{
FILE * in=fopen("arbint.in","r");
FILE * out=fopen("arbint.out","w");
fscanf(in,"%d%d",&n,&m);
for (i=0;i<n;++i)
fscanf(in,"%d",a+i);
build(a,0,0,n-1);
while (m--)
{
fscanf(in,"%d%d%d",&x,&y,&z);
if (x==0)
fprintf(out,"%d\n",q(0,0,n-1,y-1,z-1));
else
up(0,y-1,z,0,n-1);
}
fclose(in);
fclose(out);
return 0;
}