#include <cstdio>
#include <cstring>
#define TSize 262145
#define buffSize 262144
using namespace std;
int sol,ind=0,ok=1;
int T[TSize];
char buff[buffSize];
inline void read(int &x)
{
if(ok)
{
fread(buff,1,buffSize,stdin);
ind=0;
ok=0;
}
x=0;
while(buff[ind]<='9'&&buff[ind]>='0'&&ind<buffSize)
{
x*=10;
x+=buff[ind]-'0';
++ind;
if(ind>=buffSize)
{
fread(buff,1,buffSize,stdin);
ind=0;
}
}
while((buff[ind]>'9'||buff[ind]<'0')&&ind<buffSize)
{
++ind;
if(ind>=buffSize)
{
fread(buff,1,buffSize,stdin);
ind=0;
}
}
}
inline void update(int nod,int L,int R,int pos,int val)
{
if(L==pos&&pos==R)
{
T[nod]=val;
return;
}
int M=(L+R)>>1;
if(pos<=M) update(nod<<1,L,M,pos,val);
else update((nod<<1)+1,M+1,R,pos,val);
T[nod]=T[(nod<<1)+1];
if(T[nod]<T[nod<<1]) T[nod]=T[nod<<1];
}
inline void query(int nod,int L,int R,int a,int b)
{
if(a<=L&&R<=b)
{
if(sol<T[nod]) sol=T[nod];
return;
}
int M=(L+R)>>1;
if(a<=M) query(nod<<1,L,M,a,b);
if(b>M) query((nod<<1)+1,M+1,R,a,b);
}
int main()
{
int M,N,x,a,b;
freopen("arbint.in","r",stdin);
read(N);
read(M);
for(int i=1;i<=N;++i)
{
read(x);
update(1,1,N,i,x);
}
freopen("arbint.out","w",stdout);
for(;M--;)
{
read(x);
read(a);
read(b);
if(x) update(1,1,N,a,b);
else
{
sol=0;
query(1,1,N,a,b);
printf("%d\n",sol);
}
}
return 0;
}