#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int v[100001],vmax,aint[200001];
void query(int nod,int left,int right,int ql,int qr) {
int mid;
mid=(left+right)/2;
if(ql>=left and right<=qr)
vmax=max(vmax,v[nod]);
else{
if(mid<=ql) // ma duc la dreapta
query(nod*2+1,mid,right,ql,qr);
if(mid>qr) // ma duc la stanga
query(nod*2,left,mid,ql,qr);
}
}
void maketree(int poz,int left, int right)
{
if(left==right)
aint[poz]=v[right];
else{
int med=(left+right)/2;
maketree(poz*2,left,med);
maketree(poz*2+1,med+1,right);
aint[poz]=max(aint[poz*2],aint[poz*2+1]);
}
}
void update(int poz,int left, int right, int target, int val)
{
if(left==right)
aint[poz]=v[right];
else{
int med=(left+right)/2;
if(target<=med)
update(poz*2,left,med,target,val);
else
update(poz*2+1,med+1,right,target,val);
aint[poz]=max(aint[poz*2],aint[poz*2+1]);
}
}
int main() {
int n,m,i,t;
cin>>n>>m;
for(i=1; i<=n; i++) {
cin>>v[i];
}
maketree(1,1,n);
int c,a,b;
for(t=1; t<=m; t++) {
cin>>c>>a>>b;
if(c==1) {
update(1,1,n,a,b);
}
else if(c==0) {
vmax=0;
query(1,1,n,a,b);
cout<<vmax<<'\n';
}
}
return 0;
}