#include <fstream>
#define Nmax 100009
#include <algorithm>
#define oo 2000000000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,poz,A,B,val,Arb[4*Nmax],sol;
void Update(int node,int st,int dr,int A,int B)
{
if(A<=st && dr<=B)
{
Arb[node]=val;
return;
}
int mij=(st+dr)>>1, s1=node<<1, s2=(node<<1)+1;
if(A<=mij)Update(s1,st,mij,A,B);
else if(mij<B)Update(s2,mij+1,dr,A,B);
Arb[node]=max(Arb[s1],Arb[s2]);
}
void Query(int node,int st,int dr,int A,int B)
{
if(A<=st && dr<=B)
{
sol=max(sol,Arb[node]);
return;
}
int mij=(st+dr)>>1, s1=node<<1, s2=(node<<1)+1;
if(A<=mij)Query(s1,st,mij,A,B);
if(mij<B) Query(s2,mij+1,dr,A,B);
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;++i)
f>>val , Update(1,1,N,i,i);
for(int i=1;i<=M;++i)
{
int op , x,y;
f>>op>>x>>y;
if(op==1) val=y ,Update(1,1,N,x,x);
else sol=-oo,Query(1,1,N,x,y),g<<sol<<'\n';
}
f.close();g.close();
return 0;
}