#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[NMAX],n,m,a,b,V,segmTree[4*NMAX];
void update_st(int nod, int st, int dr, int pos, int val){
if(st==dr){
segmTree[nod]=val;
return;
}
int mid=(st+dr)/2, fs=2*nod;
if(pos>mid)
update_st(fs+1,mid+1,dr,pos,val);
else
update_st(fs,st,mid,pos,val);
segmTree[nod]=max(segmTree[fs],segmTree[fs+1]);
}
int get_max(int nod,int st,int dr,int a,int b){
if(st>=a && dr<=b)
return segmTree[nod];
if(a>dr || st>b)
return 0;
int mid=(st+dr)/2,fs=2*nod;
return max( get_max(fs,st,mid,a,b), get_max(fs+1,mid+1,dr,a,b) );
}
void build_st(int nod,int st,int dr){
if(st==dr)
segmTree[nod]=v[st];
else{
int mid=(st+dr)/2,fs=2*nod;
build_st(fs,st,mid);
build_st(fs+1,mid+1,dr);
segmTree[nod]=max(segmTree[fs],segmTree[fs+1]);
}
}
int main(){
fin>>n>>m;
for(int i=1;i<=n;++i)
fin>>v[i];
build_st(1,1,n);
for(int i=1;i<=m;++i){
fin>>V>>a>>b;
if(!V)
fout<<get_max(1,1,n,a,b)<<'\n';
else
update_st(1,1,n,a,b);
}
return 0;
}