// O(MlogN)
#include <fstream>
#define Nmax 100099
#define oo 2000000000
#define LS(i) (i<<1)
#define RS(i) (i<<1)+1
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,v[Nmax],Arb[4*Nmax],poz,val,A,B,sol;
void Update(int nod,int st,int dr),Querry(int nod,int st,int dr);
int main()
{
f>>N>>M;
for(poz=1;poz<=N;++poz)f>>val,Update(1,1,N);
for(int i=1;i<=M;++i)
{
bool op;
f>>op>>A>>B;
if(!op) sol=-oo,Querry(1,1,N),g<<sol<<'\n';
else poz=A,val=B,Update(1,1,N);
}
f.close();g.close();
return 0;
}
void Querry(int nod,int st,int dr)
{
if(A<=st && dr<=B)
{
if(sol<Arb[nod])sol=Arb[nod];
return;
}
int mij=(st+dr)>>1;
if(A<=mij)Querry(LS(nod), st ,mij);
if(mij<B) Querry(RS(nod), mij+1,dr );
}
void Update(int nod,int st,int dr)
{
if(st==dr){ Arb[nod]=val; return; }
int mij=(st+dr)>>1,son1=nod<<1,son2=(nod<<1)+1;
if(poz<=mij)Update(son1, st ,mij);
else Update(son2,mij+1,dr );
if(Arb[son1]>Arb[son2]) Arb[nod]=Arb[son1];
else Arb[nod]=Arb[son2];
}