#include <iostream>
#include <cstdio>
using namespace std;
int segment_tree[2 * 100001];
int a[100001];
const int oo = 99999999;
int m, n;
void recalculate(int node){
segment_tree[node] = max(segment_tree[2 * node + 1], segment_tree[2 * node + 2]);
}
void build(int node, int left, int right){
if(left == right) {
segment_tree[node] = a[left];
} else {
int middle = (left + right) / 2;
build(2 * node + 1, left, middle);
build(2 * node + 2, middle + 1, right);
recalculate(node);
}
}
void update(int node, int left, int right, int x, int y){
if(left == right) {
segment_tree[node] = y;
} else {
int middle = (left + right) / 2;
if(x <= middle) {
update(2 * node + 1, left, middle, x , y);
} else {
update(2 * node + 2, middle + 1, right, x, y);
}
recalculate(node);
}
}
int query(int node, int left, int right, int x, int y){
if(x <= left and right <= y){
return segment_tree[node];
} else {
int answer = -oo;
int middle = (left + right) / 2;
if(x <= middle) {
answer = max(answer, query(2 * node + 1, left, middle, x, y));
}
if(y >= middle + 1){
answer = max(answer, query(2 * node + 2, middle + 1, right, x, y));
}
return answer;
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int code, x, y;
cin >> m >> n;
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
build(0, 1, n);
for(int i = 1; i <= m; ++i){
cin >> code >> x >> y;
if(code == 0){
cout << query(0, 1, n, x, y) << '\n';
} else {
update(0, 1, n, x, y);
}
}
return 0;
}