#include <iostream>
#include <cstdio>
using namespace std;
int m,n,tip,aux1,aux2,vCit[100005];
int arbint[400005];
void build(int st,int dr,int idx)
{
if(st==dr)
{
arbint[idx]=vCit[st];
return;
}
build(st,(st+dr)/2,2*idx);
build((st+dr)/2+1,dr,2*idx+1);
arbint[idx]=max(arbint[2*idx],arbint[2*idx+1]);
}
int sol;
void query(int st,int dr,int ST,int DR,int idx)
{
if(ST<=st&&dr<=DR)
{
sol=max(sol,arbint[idx]);
return;
}
int mij=(st+dr)/2;
if(DR>mij)
query(mij+1,dr,ST,DR,2*idx+1);
if(ST<=mij)
query(st,mij,ST,DR,2*idx);
}
void update(int poz,int nr,int st,int dr,int idx)
{
if(st==dr)
{
if(st==poz)
arbint[idx]=nr;
return;
}
update(poz,nr,st,(st+dr)/2,2*idx);
update(poz,nr,(st+dr)/2+1,dr,2*idx+1);
arbint[idx]=max(arbint[2*idx],arbint[2*idx+1]);
}
void printarb()
{
for(int i=1;i<=4*n;i++)
printf("%d",arbint[i]);
printf("\n");
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
scanf("%d",&vCit[i]);
}
build(1,n,1);
//printarb();
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&tip,&aux1,&aux2);
if(tip)
{
update(aux1,aux2,1,n,1);
//printarb();
}
else
{
sol=0;
query(1,n,aux1,aux2,1);
printf("%d\n",sol);
}
}
return 0;
}