#include <cstdio>
#include <algorithm>
#define Nmax 4 * 100005
#define INF 0x3f3f3f3f;
using namespace std;
int x,st,dr,ind,ans;
int range[ Nmax ];
void Update(int li,int lf,int pz)
{
if(li == lf)
{
range[ pz ] = x;
return;
}
int m = li +((lf-li)>>1);
if(ind <= m) Update(li,m,pz<<1);
if(ind > m) Update(m+1,lf,(pz<<1)+1);
range[ pz ] = max ( range[pz << 1] , range[(pz<<1) + 1]);
}
void Querry(int li,int lf,int pz)
{
if(li == lf)
{
ans = max(ans,range[ pz ]);
return;
}
if(st <= li && lf <= dr)
{
ans = max(ans,max(range[pz<<1],range[(pz<<1)+1]));
return;
}
int m = li + ((lf-li)>>1);
if(st <= m) Querry(li,m,pz<<1);
if(dr > m) Querry(m+1,lf,(pz<<1)+1);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int N,M,op;
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
{
ind = i;
scanf("%d",&x);
Update(1,N,1);
}
for(int i = 1; i <= M; ++i)
{
scanf("%d",&op);
if(op == 0)
{
ans = -INF;
scanf("%d%d",&st,&dr);
Querry(1,N,1);
printf("%d\n",ans);
}
else
{
scanf("%d%d",&ind,&x);
Update(1,N,1);
}
}
return 0;
}