#include <stdio.h>
#define max(a,b) ((a)>(b) ? (a):(b))
int a[100009],t[400009],n,m,i,x,y,z;
int next_int()
{
char c=getchar();
while (c>57 || c < 48) c=getchar();
int k=0;
while (c<=57 && c>=48)
{
k=k*10+c-48;
c=getchar();
}
return k;
}
void build(int * a,int v,int st,int dr)
{
if (st==dr)
t[v]=a[st]; else
{
int tmp=(st+dr)>>1;
int kl=v<<1;
build(a,kl+1,st,tmp);
build(a,kl+2,tmp+1,dr);
t[v]=max(t[kl+1],t[kl+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)>>1;
int kl=v<<1;
if (l>tmp)
return q(kl+2,tmp+1,dr,l,r); else
if (r<=tmp)
return q(kl+1,st,tmp,l,r); else
return max(q(kl+1,st,tmp,l,tmp),q(kl+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)>>1;
int kl=v<<1;
if (index<=tmp)
up(kl+1,index,value,st,tmp);
else up(kl+2,index,value,tmp+1,dr);
t[v]=max(t[kl+1],t[kl+2]);
}
}
int main()
{
FILE * in=freopen("arbint.in","r",stdin);
FILE * out=freopen("arbint.out","w",stdout);
n=next_int();
m=next_int();
for (i=0;i<n;++i)
a[i]=next_int();
build(a,0,0,n-1);
while (m--)
{
x=next_int();
y=next_int();
z=next_int();
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;
}