//BC
/*
Care este diferenta dintre o blonda si muntele Everest?
Pe Everest nu urca oricine
*/
#include <stdio.h>
#define maxN 100000
#define max(a,b) a>b?a:b
int S[maxN*5];
int sir[maxN];
int n,m,poz,St,Dr,rez;
void creare(int nod,int st,int dr)
{
if (st==dr)
{
S[nod]=sir[st];
return ;
}
int mij=(st+dr)>>1;
int nodS=nod<<1;
int nodD=nodS+1;
creare(nodS,st,mij);
creare(nodD,mij+1,dr);
S[nod]=max(S[nodS],S[nodD]);
}
void citire()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
scanf ("%d %d",&n,&m);
for (int i=1;i<=n;i++)
scanf ("%d ",&sir[i]);
creare(1,1,n);
}
void update(int nod,int st,int dr)
{
if (st==dr)
{
S[nod]=sir[st];
return ;
}
int mij=(st+dr)>>1;
int nodS=nod<<1;
int nodD=nodS+1;
if (mij>=poz)
update(nodS,st,mij);
else
update(nodD,mij+1,dr);
S[nod]=max(S[nodS],S[nodD]);
}
void maxim(int nod,int st,int dr)
{
if (St<=st && dr<=Dr)
{
rez=max(rez,S[nod]);
return ;
}
int mij=(st+dr)>>1;
int nodS=nod<<1;
int nodD=nodS+1;
if (St<=mij)
maxim(nodS,st,mij);
if (Dr>=mij+1)
maxim(nodD,mij+1,dr);
}
void solve()
{
int tip;
for (int i=0;i<m;i++)
{
scanf ("%d %d %d",&tip,&St,&Dr);
if (tip)
{
sir[St]=Dr;
poz=St;
update(1,1,n);
}
else
{
rez=-32000;
maxim(1,1,n);
printf("%d\n",rez);
}
}
}
int main ()
{
citire();
solve();
return 0;
}