#include<fstream>
using namespace std;
int v[100010],A[400010];
int n,m,sol,a,b,i,j,operatie;
inline int maxim(int x,int y)
{if(x>y)
return x;
return y;
}
void build(int nod,int st,int dr)
{if(st==dr)
A[nod]=v[st];
else{
int mij=(st+dr)/2;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
}
void update(int nod,int st,int dr,int poz,int x)
{if(st==dr)
A[nod]=x;
else{
int mij=(st+dr)/2;
if(poz<=mij)
update(2*nod,st,mij,poz,x);
else update(2*nod+1,mij+1,dr,poz,x);
A[nod]=maxim(A[2*nod],A[2*nod+1]);
}
}
void query(int nod,int st,int dr,int a_st,int b_dr)
{if(a_st<=st && dr<=b_dr)
sol=maxim(sol,A[nod]);
else{
int mij=(st+dr)/2;
if(a_st<=mij)
query(2*nod,st,mij,a_st,b_dr);
if(b_dr>=mij+1)
query(2*nod+1,mij+1,dr,a_st,b_dr);
}
}
int main()
{ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
fin>>operatie>>a>>b;
if(operatie==1){
update(1,1,n,a,b);
}
else{
sol=0;
query(1,1,n,a,b);
fout<<sol<<endl;
}
}
return 0;
}