#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX=100000;
int v[NMAX+5];
int aint[4*NMAX+5];
void build(int nod, int st, int dr){
if(st==dr)
aint[nod]=v[st];
else
{
int med=(st+dr)/2;
build(nod*2,st,med);
build(nod*2+1,med+1,dr);
aint[nod]=max(aint[nod*2],aint[nod*2+1]);
}
}
void update(int nod, int st, int dr, int pozV, int new_val){
if(st==dr)
aint[nod]=new_val;
else
{
int med=(st+dr)/2;
if(pozV<=med)
update(2*nod,st,med,pozV,new_val);
else
update(2*nod+1,med+1,dr,pozV,new_val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int sol;
void query(int nod, int st, int dr, int a, int b){
if(a<=st && dr<=b)
sol=max(sol,aint[nod]);
else
{
int med=(st+dr)/2;
if(a<=med)
query(2*nod,st,med,a,b);
if(b>=med+1)
query(2*nod+1,med+1,dr,a,b);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i)
scanf("%d",&v[i]);
build(1,1,n);
int a,b,c;
for(int i=1;i<=q;++i)
{
scanf("%d%d%d",&c,&a,&b);
if(c==1){
v[a]=b;
update(1,1,n,a,b);
}
else
{
sol=0;
query(1,1,n,a,b);
printf("%d\n",sol);
}
}
return 0;
}