#include <stdio.h>
#define max(a,b) ((a)>(b) ? (a):(b))
int a[100009],t[400009],n,m,i,x,y,z;
inline 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;
}
inline void build(int v,int st,int dr)
{
if (st==dr)
t[v]=a[st]; else
{
int tmp=(st+dr)>>1;
int kl=v<<1;
build(kl+1,st,tmp);
build(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 st,int dr)
{
if (st==dr)
t[v]=z; else
{
int tmp=(st+dr)>>1;
int kl=v<<1;
if (y<=tmp)
up(kl+1,st,tmp);
else up(kl+2,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(0,0,n-1);
while (m--)
{
x=next_int();
y=next_int()-1;
z=next_int();
if (x==0)
fprintf(out,"%d\n",q(0,0,n-1,y,z-1));
else
up(0,0,n-1);
}
fclose(in);
fclose(out);
return 0;
}