#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n , m , v[800001] , a , b , sol[800001] , tip;
void pr(int inc , int sf , int nr) ;
int solve(int inc , int sf , int nr) ;
void update(int inc , int sf ,int nr) ;
int main()
{
f >> n >> m ;
for(int i = 1 ; i <= n ; ++i){
f >> v[i] ;
}
pr(1 , n , 1) ;
for(int i = 1 ; i <= m ; ++i){
f >> tip >> a >> b ;
if(tip == 0)
g << solve(1 , n , 1) << '\n';
else{
update(1 , n , 1) ;
}
}
return 0;
}
void pr(int inc , int sf , int nr){
if(inc == sf){
sol[nr] = v[inc] ;
return ;
}
pr(inc , (inc + sf)/2 , nr * 2);
pr((inc + sf) / 2 + 1 , sf , nr * 2 + 1) ;
sol[nr] = max(sol[nr * 2] , sol[nr * 2 + 1]) ;
}
int solve(int inc , int sf , int nr){
int mij = (inc + sf) / 2 ;
if(a <= inc && b >= sf){
return sol[nr];
}
if(b <= mij){
return solve(inc , mij , 2 * nr) ;
}
if(a > mij){
return solve(mij + 1 , sf , 2 * nr + 1) ;
}
if(a <= mij && mij <= b)
return max(solve(inc , mij , 2 * nr) , solve(mij + 1 , sf , 2 * nr + 1));
}
void update(int inc , int sf , int nr){
int mij = (inc + sf) / 2;
if(inc == sf && inc == a){
sol[nr] = b ;
return ;
}
if(a <= mij)
update(inc , (inc + sf)/2 , nr * 2);
else
update((inc + sf) / 2 + 1 , sf , nr * 2 + 1) ;
sol[nr] = max(sol[nr * 2] , sol[nr * 2 + 1]) ;
}