#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int dim=3e5+10;
class AINT{
struct Nod{
int val;
};
Nod aint[4*dim];
Nod Merge(Nod n1,Nod n2){
Nod n;
n.val=max(n1.val,n2.val);
return n;
}
public:
void Update(int nod,int tl,int tr,int pos,int val){
if(tl==tr){
aint[nod]={val};
return;
}
int tm=(tl+tr)/2;
if(pos<=tm){
Update(2*nod,tl,tm,pos,val);
}
if(pos>tm){
Update(2*nod+1,tm+1,tr,pos,val);
}
aint[nod]=Merge(aint[2*nod],aint[2*nod+1]);
}
Nod Query(int nod,int tl,int tr,int l,int r){
if(tl==l&&tr==r){
return aint[nod];
}
int tm=(tl+tr)/2;
if(r<=tm){
return Query(2*nod,tl,tm,l,r);
}
if(l>tm){
return Query(2*nod+1,tm+1,tr,l,r);
}
return Merge(Query(2*nod,tl,tm,l,tm),Query(2*nod+1,tm+1,tr,tm+1,r));
}
}aint;
signed main(){
int n,m;
fin>>n>>m;
for(int i=1;i<=n;i++){
int x;
fin>>x;
aint.Update(1,1,n,i,x);
}
while(m--){
int op,l,r;
fin>>op>>l>>r;
if(op==1){
aint.Update(1,1,n,l,r);
}else{
fout<<aint.Query(1,1,n,l,r).val<<'\n';
}
}
}