#include<fstream>
#include<cstdio>
using namespace std;
FILE *f;
ofstream g("arbint.out");
int m,n,p,i,x,y,arb[400000],a[100001];
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
void constr(int nod,int li,int ls)
{
if(li==ls)
{
arb[nod]=a[li];
return;
}
int mij=(li+ls)>>1;
constr(nod*2,li,mij);
constr(nod*2+1,mij+1,ls);
arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}
void insereaza(int nod,int li,int ls,int poz,int val)
{
if(li==ls)
{
arb[nod]=val;
return;
}
int mij=(li+ls)>>1;
if(poz<=mij)
insereaza(nod<<1,li,mij,poz,val);
else
insereaza((nod<<1)+1,mij+1,ls,poz,val);
arb[nod]=maxim(arb[nod<<1],arb[(nod<<1)+1]);
}
int query(int nod,int li,int ls,int st,int dr)
{
if(st<=li&&ls<=dr)
return arb[nod];
int mij=(li+ls)/2,x=0;
if(st<=mij)
x=query(nod<<1,li,mij,st,dr);
if(mij<dr)
x=maxim(x,query((nod<<1)+1,mij+1,ls,st,dr));
return x;
}
int main()
{
f=fopen("arbint.in","r");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;++i)
{
fscanf(f,"%d",&a[i]);
constr(1,1,n);
}
for(i=1;i<=m;++i)
{
fscanf(f,"%d%d%d",&p,&x,&y);
if(p==1)
insereaza(1,1,n,x,y);
else
g<<query(1,1,n,x,y)<<'\n';
}
return 0;
}