#include <cstdio>
#define N 100001
#define left(x) 2*(x)
#define right(x) 2*(x)+1
#define pr(x) (x)/2
struct {long st,dr,max;}sir[2*N];
long p[N];
long n;
void modifica(long a,long b)
{long i=p[a],max;
sir[i].max=b;
for (i=pr(i);i;i=pr(i))
{max=0;
if(left(i)<2*n&&sir[left(i)].max>max)
{max=sir[left(i)].max;}
if(right(i)<2*n&&sir[right(i)].max>max)
{max=sir[right(i)].max;}
sir[i].max=max;
}
}
void creeaza(long nod,long st,long dr)
{sir[nod].st=st;sir[nod].dr=dr;
if(st==dr)
{p[st]=nod;
}
else
{if(left(nod)<2*n)
{creeaza(left(nod),st,(dr+st)/2);
}
if(right(nod)<2*n)
{creeaza(right(nod),(st+dr)/2+1,dr);
}
}
}
long max(long nod, long st,long dr)
{if(st<=sir[nod].st&&sir[nod].dr<=dr)
{return sir[nod].max;}
else
{long m=0,t;
if(left(nod)<2*n && st<=sir[left(nod)].dr)
{if(m<(t=max(left(nod),st,dr)))
{m=t;
}
}
if(right(nod)<2*n && dr>=sir[right(nod)].st)
{if(m<(t=max(right(nod),st,dr)))
{m=t;
}
}
return m;
}
}
int main ()
{long i,m,flag,a,b,c;
FILE *fin=fopen ("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
fscanf(fin,"%ld%ld",&n,&m);
creeaza(1,1,n);
for (i=1;i<=n;i++)
{fscanf(fin,"%ld",&c);
modifica(i,c);
}
for (i=1;i<=m;i++)
{fscanf(fin,"%ld%ld%ld",&flag,&a,&b);
if(flag==0)
{fprintf(fout,"%ld\n",max(1,a,b));
}
else
{modifica(a,b);//el de pe pozitia a devine b
}
}
fclose(fout);
return 0;
}