#include <fstream>
#include<algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int x[100001],A[200001],n,m;
void creare_arb(int nod,int st_arb,int dr_arb)
{
int mij;
if(st_arb==dr_arb)
A[nod]=x[st_arb];
else
{
mij=(st_arb+dr_arb)/2;
creare_arb(2*nod,st_arb,mij);
creare_arb(2*nod+1,mij+1,dr_arb);
A[nod]=max(A[2*nod],A[2*nod+1]);
}
}
void actualizare_arb(int nod,int st_arb,int dr_arb,int poz,int val)
{
int mij;
if(st_arb==dr_arb)
A[nod]=val;
else
{
mij=(st_arb+dr_arb)/2;
if(poz<=mij)
actualizare_arb(2*nod,st_arb,mij,poz,val);
else actualizare_arb(2*nod+1,mij+1,dr_arb,poz,val);
A[nod]=max(A[2*nod],A[2*nod+1]);
}
}
int interogare_arb(int nod,int st_arb,int dr_arb,int st_x,int dr_x)
{
int mij,rez,rez1,rez2;
if(st_x<=st_arb && dr_arb<=dr_x)
return A[nod];
else
{
mij=(st_arb+dr_arb)/2;
rez=-1;
if(st_x<=mij &&st_arb<=dr_x)
{
rez1=interogare_arb(2*nod,st_arb,mij,st_x,dr_x);
rez=max(rez,rez1);
}
if(st_x<=dr_arb && mij+1<=dr_x)
{
rez2=interogare_arb(2*nod+1,mij+1,dr_arb,st_x,dr_x);
rez=max(rez,rez2);
}
return rez;
}
}
int main()
{
int tip,a,b,i;
f>>n>>m;
for(i=1;i<=n;i++)
f>>x[i];
creare_arb(1,1,n);
for(i=1;i<=m;i++)
{
f>>tip>>a>>b;
if(tip==1)
actualizare_arb(1,1,n,a,b);
else g<<interogare_arb(1,1,n,a,b)<<endl;
}
return 0;
}