#include <iostream>
#include <cstdio>
FILE *f,*g;
using namespace std;
long I[200010][2],T[200010],V[200010][2],Max[200010],F1[200010],F2[200010];
long int calculeaza(long a,long b,long A,long B,long i)
{
if(a==A && b==B)
{
return Max[i];
}
else
{
if(b <= I[F1[i]][1])
{
return calculeaza(a,b,I[F1[i]][0],I[F1[i]][1],F1[i]);
}
else
{
if(a >= I[F2[i]][0])
{
return calculeaza(a,b,I[F2[i]][0],I[F2[i]][1],F2[i]);
}
else
{
return max(calculeaza(a,I[F1[i]][1],I[F1[i]][0],I[F1[i]][1],F1[i]),calculeaza(I[F2[i]][0],b,I[F2[i]][0],I[F2[i]][1],F2[i]));
}
}
}
}
int main()
{
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
long i,j,k,N,M,inc=1,sf=1;
fscanf(f,"%ld%ld",&N,&M);
for(i=1;i<=N;i++)
{
fscanf(f,"%ld",&V[i][0]);
}
I[sf][0]=1;
I[sf][1]=N;
T[sf]=0;
while(inc<=sf)
{
long a,b;
if(I[inc][0]==I[inc][1])
{
V[I[inc][0]][1]=inc;
Max[inc]=V[I[inc][0]][0];
inc++;
}
else
{
I[++sf][0]=I[inc][0];
I[sf][1]=I[inc][0]+(I[inc][1]-I[inc][0])/2;
T[sf]=inc;
F1[inc]=sf;
I[++sf][0]=I[inc][0]+(I[inc][1]-I[inc][0])/2 + 1;
I[sf][1]=I[inc][1];
T[sf]=inc;
F2[inc]=sf;
inc++;
}
}
for(i=sf;i>1;i-=2)
{
Max[T[i]]=max(Max[i],Max[i-1]);
}
int cod;
long a,b;
for(i=1;i<=M;i++)
{
fscanf(f,"%d%ld%ld",&cod,&a,&b);
if(!cod)
{
fprintf(g,"%ld\n",calculeaza(a,b,1,N,1));
}
else
{
long poz;
poz=V[a][1];
V[a][0]=b;
Max[poz]=b;
if(poz%2==0)
{
poz++;
}
while(poz>1)
{
Max[T[poz]]=max(Max[poz],Max[poz-1]);
poz=T[poz];
}
}
}
fclose(f);
fclose(g);
return 0;
}