//#include <fstream>
#include<stdio.h>
#include<algorithm>
using namespace std;
//ifstream f("arbint.in");
FILE *f=fopen("arbint.in","r");
//ofstream g("arbint.out");
FILE *g=fopen("arbint.out","w");
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;
fscanf(f,"%d %d",&n, &m);
for(i=1;i<=n;i++)
// f>>x[i];
fscanf(f,"%d",&x[i]);
creare_arb(1,1,n);
for(i=1;i<=m;i++)
{
//f>>tip>>a>>b;
fscanf(f,"%d %d %d",&tip,&a,&b);
if(tip==1)
actualizare_arb(1,1,n,a,b);
else //g<<interogare_arb(1,1,n,a,b)<<endl;
fprintf(g,"%d\n",interogare_arb(1,1,n,a,b));
}
return 0;
}