#include <fstream>
#include <vector>
using std::vector;
unsigned put(unsigned pos, unsigned val, vector<unsigned> &tree, unsigned node, unsigned cleft, unsigned cright){
// !!! cleft<=pos and pos<=cright
if(cleft==cright) return tree[node]=val;
else{
unsigned mid = (cleft+cright)/2;
if(pos<=mid){
tree[node]=tree[2*node+1];
unsigned left = put(pos,val,tree,2*node,cleft,mid);
if(left>tree[node]) tree[node]=left;
}
else{
tree[node]=tree[2*node];
unsigned right = put(pos,val,tree,2*node+1,mid+1,cright);
if(right>tree[node]) tree[node]=right;
}
return tree[node];
}
}
unsigned getmax(unsigned a,unsigned b, vector<unsigned> &tree, unsigned node, unsigned cleft, unsigned cright){
// !!! cleft <= a <= b <= cright
if(cleft==cright) return tree[node];
else{
unsigned mid = (cleft+cright)/2;
if(b<=mid) return getmax(a,b,tree,2*node,cleft,mid);
else if(a<=mid&&b>mid){
unsigned left=getmax(a,mid,tree,2*node,cleft,mid);
unsigned right=getmax(mid+1,b,tree,2*node+1,mid+1,cright);
if(left>right) return left;
else return right;
}
else return getmax(a,b,tree,2*node+1,mid+1,cright);
}
}
int main(){
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
unsigned N,M;
fin>>N>>M;
vector<unsigned> tree( ( (N&(N-1))==0 )?(2*N):(4*N) ,0);
unsigned temp1,temp2;
char c;
for(temp1=1;temp1<=N;++temp1){
fin>>temp2;
put(temp1,temp2,tree,1,1,N);
}
while(M--){
fin>>c>>temp1>>temp2;
if(c=='0') fout<<getmax(temp1,temp2,tree,1,1,N)<<'\n';
else put(temp1,temp2,tree,1,1,N);
}
}