#include <fstream>
#define inf (1 << 30)
using namespace std;
int const NM = 1e6 + 7;
int V [NM] , aint [NM];
inline void build (int node , int from , int to){
if (from < to){
int mid = (from + to) >> 1;
build (node * 2 + 1 , from , mid);
build (node * 2 , mid + 1 , to);
aint [node] = max (aint [node * 2] , aint [node * 2 + 1]);
}
else
aint [node] = V [from];
}
inline int update (int node , int from , int to , int a , int b){
if (from < to){
int mid = (from + to) >> 1;
if (a <= mid)
update (node * 2 + 1 , from , mid , a , b);
else
update (node * 2 , mid + 1 , to , a , b);
aint [node] = max (aint [node * 2 + 1] , aint [node * 2]);
}
else
aint [node] = b;
}
inline int query (int node , int from , int to , int a , int b){
if (to < a or from > b)
return -inf;
if (to <= b && from >= a)
return aint [node];
int mid = (from + to) >> 1;
return max (query (node * 2 + 1 , from , mid , a , b) , query (node * 2 , mid + 1 , to , a , b));
}
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int main (){
int i , n , j , q;
cin >> n >> q;
for(i = 1 ; i <= n ; ++ i)
cin >> V [i];
build (1 , 1 , n);
for(i = 1 ; i <= q ; ++ i){
int a , b , p;
cin >> p >> a >> b;
if (p == 0)
cout << query (1 , 1 , n , a , b) << '\n';
else
update (1 , 1 , n , a , b);
}
}