#include<iostream>
#include<cstdio>
#include<vector>
#include<fstream>
using namespace std;
struct node{
int a,b,v;
node *l=NULL,*r=NULL;
};
ifstream fin("arbint.in");
ofstream fout("arbint.out");
node *root;
node* constr(int l, int r, vector<int>& v){
node *n=new node();
n->a=l;
n->b=r;
if(r-l==0){
n->v=v[l-1];
}
else{
int m=(l+r)/2;
n->l=constr(l,m,v);
n->r=constr(m+1,r,v);
n->v=max(n->l->v,n->r->v);
}
return n;
}
void setV(int poz, int v, node *n){
//cout<<"sv: "<<poz<<" "<<v<<" "<<n->a<<" "<<n->b<<"\n";
if(n->a==poz&&n->b==poz){
n->v=v;
}
else{
int m=(n->a+n->b)/2;
if(poz<=m){
setV(poz,v,n->l);
}
else{
setV(poz,v,n->r);
}
int a=n->l->v,b=n->r->v;
n->v=max(a,b);
}
}
int getM(node *n, int l, int r){
//cout<<n->a<<" "<<n->b<<" "<<l<<" "<<r<<"\n";
if(l<=n->a&&r>=n->b){
return n->v;
}
if(l>n->b||r<n->a){
return 0;
}
int a=getM(n->l,l,r),b=getM(n->r,l,r);
return max(a,b);
}
void show(node *n, int l){
if(n==NULL){
return;
}
for(int i=0;i<l;++i){
cout<<"\t";
}
cout<<n->a<<" "<<n->b<<" "<<n->v<<"\n";
show(n->l,l+1);
show(n->r,l+1);
}
int main(){
int n,m;
fin>>n>>m;
vector<int> v(n);
for(int i=0;i<n;++i){
//scanf("%d",&(v[i]));
fin>>v[i];
}
root=constr(1,n,v);
//show(root,0);
int x,y,z;
for(int i=0;i<n;++i){
//scanf("%d%d%d",&x,&y,&z);
fin>>x>>y>>z;
if(x==0){
//printf("%d\n",getM(root,y,z));
fout<<getM(root,y,z)<<"\n";
//cout<<"\n";
}
else{
setV(y,z,root);
//show(root,0);
}
}
fin.close();
fout.close();
return 0;
}