#include<iostream>
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
#define MAXNODES 100000
int tree[3*MAXNODES],values[MAXNODES],num_nodes,num_queries;
inline int middle(int left,int right){
return (left+right)/2;
}
void build_tree(int left,int right,int index){
if(left==right){
tree[index]=values[left];
}
else{
int mid=middle(left,right);
build_tree(left,mid,index*2);
build_tree(mid+1,right,index*2+1);
tree[index]=max(tree[index*2],tree[index*2+1]);
}
}
int query(int left,int right,int a,int b,int index){
if(left>=a && right<=b){
return tree[index];
}
int mid=middle(left,right);
int result=-1;
if(a<=mid){
result=max(result,query(left,mid,a,b,index*2));
}
if(b>mid){
result=max(result,query(mid+1,right,a,b,index*2+1));
}
return result;
}
void modify(int left,int right,int position,int value,int index){
if(left==right){
tree[index]=value;
}
else{
int mid=middle(left,right);
if(position<=mid){
modify(left,mid,position,value,index*2);
}
else modify(mid+1,right,position,value,index*2+1);
tree[index]=max(tree[index*2],tree[index*2+1]);
}
}
void read(){
in>>num_nodes>>num_queries;
for(int i=0;i<num_nodes;i++){
in>>values[i];
}
}
void solve(){
build_tree(0,num_nodes-1,1);
int a,b,c;
for(int i=0;i<num_queries;i++){
in>>a>>b>>c;
if(a==0){
out<<query(0,num_nodes-1,b-1,c-1,1)<<'\n';
}
else{
modify(0,num_nodes-1,b-1,c,1);
}
}
}
int main(){
read();
solve();
return 0;
}