#include <fstream>
#include <vector>
#include <iostream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
class tree{
public:
std::vector<int> arr;
tree(int dim){
arr.resize(4*dim, 0);
}
void update(int node, int left, int right, int pos, int element);
int query(int node, int left, int right, int L, int R);
};
int main()
{
int n, m;
fin >> n >> m;
tree Tree(4*n);
for(int i = 1; i <= n; i++){
int el;
fin >> el;
Tree.update(1, 1, n, i, el);
}
for(int i = 1; i <= m; i++){
int op, x, y;
fin >> op >> x >> y;
if(op == 0){
fout << Tree.query(1, 1, n, x, y) << "\n";
}
else{
Tree.update(1, 1, n, x, y);
}
}
return 0;
}
void tree::update(int node, int left, int right, int pos, int element){
if(left == right){
arr[node] = element;
return;
}
int mid = left + (right - left)/2;
if(mid < pos) {
update(node * 2 + 1, mid + 1, right, pos, element);
}
else {
update(node * 2, left, mid, pos, element);
}
arr[node] = std::max(arr[node * 2], arr[node * 2 + 1]);
}
int tree::query(int node, int left, int right, int L, int R){
if(L <= left && right <= R){
return arr[node];
}
int mid = left + (right - left)/2;
int value1 = 0, value2 = 0;
if(L <= mid){
value1 = query(node * 2, left, mid, L, R);
}
if(R > mid){
value2 = query(node * 2 + 1, mid + 1, right, L, R);
}
return std::max(value1, value2);
}