#include <stdio.h>
#define mx 400010
long n,a,b,c,i,m,s;
long array[mx];
long max(long a, long b)
{
long max;
max=a;
if (max<b)
{
max=b;
}
return max;
}
void comp(long nod)
{
if (array[nod]>s)
{
s=array[nod];
}
}
void add(long nod, long p, long u, long poz, long val)
{
long m;
if (p==u)
{
array[nod]=val;
}
else
{
m=(p+u)/2;
if (poz<=m)
{
add(2*nod,p,m,poz,val);
}
if (m<poz)
{
add(2*nod+1,m+1,u,poz,val);
}
array[nod]=max(array[2*nod],array[2*nod+1]);
}
}
void query(long nod, long p, long u)
{
long m;
if (a<=p && u<=b)
{
comp(nod);
return;
}
if (p<u)
{
m=(p+u)/2;
if (a<=m)
{
query(2*nod,p,m);
}
if (m<b)
{
query(2*nod+1,m+1,u);
}
}
}
int main(void)
{
FILE *f,*g;
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
fscanf(f,"%ld %ld",&n,&m);
for (i=1; i<=n; i++)
{
fscanf(f,"%ld",&a);
add(1,1,n,i,a);
}
for (i=1; i<=m; i++)
{
fscanf(f,"%ld %ld %ld",&c,&a,&b);
if (c == 1)
add(1,1,n,a,b);
else
{
s=0;
query(1,1,n);
fprintf(g,"%ld\n",s);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}