#include<bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
//vector<int> arbint;
const int N_max= 100000;
int arbint[4*N_max+1];
void arboreInterval(int nod, int stanga, int dreapta, int pozitie, int valoare){
if(stanga==dreapta){
arbint[nod]=valoare;
return;
}
else{
int mijloc;
mijloc=(stanga+dreapta)/2;
if(pozitie<=mijloc){
arboreInterval(nod*2,stanga,mijloc,pozitie,valoare);
}
else{
arboreInterval(nod*2+1,mijloc+1,dreapta,pozitie,valoare);
}
arbint[nod]=max(arbint[nod*2],arbint[nod*2+1]);
}
}
void query(int nod, int stanga, int dreapta, int queryStanga, int queryDreapta,int &ans ){
if(stanga>queryDreapta || dreapta<queryStanga){
//return 0;
return ;
}
if(stanga>=queryStanga && dreapta<=queryDreapta){
//return arbint[nod];
ans=arbint[nod];
return;
}
int mijloc;
mijloc=(stanga+dreapta)/2;
if(queryStanga<=mijloc){
query(nod*2,stanga,mijloc,queryStanga,queryDreapta,ans);
}
if(mijloc<queryDreapta){
query(nod*2+1,mijloc+1,dreapta,queryStanga,queryDreapta,ans);
}
}
int main(){
//arbint.assign(1000001,0);
vector<int> v;
int n,m,i,j,valoare,queryStanga,queryDreapta,ans,pozitie;
bool tip;
f>>n>>m;
for(i=0;i<n;++i){
f>>valoare;
arboreInterval(1,1,n,i+1,valoare);
/*for(j=1;j<=4*n+1;++j){
cout<<arbint[j]<<" ";
}
cout<<endl;*/
}
for(i=0;i<m;++i){
f>>tip>>queryStanga>>queryDreapta;;
if(tip==0){
ans=0;
query(1,1,n,queryStanga,queryDreapta,ans);
g<<ans<<'\n';
}
else{
arboreInterval(1,1,n,queryStanga,queryDreapta);
}
}
return 0;
}