#include <fstream>
#define INF 10000
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
class arboreintervale{
private:
int *arb;
public:
arboreintervale(int n){
arb=new int[n+2];
}
~arboreintervale(){
delete []arb;
}
void update(int p,int st, int dr, int val, int poz){
if(st==dr){
arb[p]=val;
return;
}
int mij=(st+dr)/2;
if( poz<=mij){
update(2*p,st,mij,val,poz);
}
else{
update(2*p+1,mij+1,dr,val,poz);
}
arb[p] = max(arb[2*p], arb[2*p+1]);
}
int query(int p, int st, int dr, int a, int b){
if( a<=st && dr<=b ){
return arb[p];
}
int mij=(st+dr)/2, m1=-INF, m2=-INF;
if(a<=mij)
m1=query(2*p,st,mij,a,b);
if(b>mij)
m2=query(2*p+1,mij+1,dr,a,b);
return max(m1,m2);
}
};
int main(){
int n, m, x, i, poz, val, a, b;
f>>n>>m;
arboreintervale arb(n);
for(i=1;i<=n;++i){
f>>x;
arb.update(1,1,n,x,i);
}
for(i=1;i<=m;++i){
f>>x;
if(x==1){
f>>poz>>val;
arb.update(1,1,n,val,poz);
}
else{
f>>a>>b;
g<<arb.query(1,1,n,a,b)<<"\n";
}
}
}