#include <bits/stdc++.h>
#define LEFT(pos) ((pos * 2) + 1)
#define RIGHT(pos) ((pos + 1) * 2)
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
vector<int> arr;
vector<int> seg_tree;
int rec_fill(int pos, int left, int right) {
if (left == right) {
seg_tree[pos] = arr[left];
return seg_tree[pos];
}
int middle = left + ((right - left) >> 1);
seg_tree[pos] = max(
rec_fill(LEFT(pos), left, middle),
rec_fill(RIGHT(pos), middle + 1, right)
);
return seg_tree[pos];
}
void create_segment_tree() {
seg_tree.clear();
int h;
for (h = 0; ((size_t)1 << h) <= arr.size(); ++h);
seg_tree.resize(2 * (1 << h) - 1, -1);
rec_fill(0, 0, arr.size() - 1);
}
int rec_query(int pos, int seg_left, int seg_right, int query_left, int query_right) {
if (seg_right < query_left || query_right < seg_left) {
return -1;
}
if (query_left <= seg_left && seg_right <= query_right) {
return seg_tree[pos];
}
int middle = seg_left + ((seg_right - seg_left) >> 1);
return max(
rec_query(LEFT(pos), seg_left, middle, query_left, query_right),
rec_query(RIGHT(pos), middle + 1, seg_right, query_left, query_right)
);
}
int query(int left, int right) {
--left;
--right;
return rec_query(0, 0, arr.size() - 1, left, right);
}
int rec_update(int pos, int left, int right, int arr_pos, int arr_value) {
if (left > arr_pos || right < arr_pos) {
return seg_tree[pos];
}
if (left == right) {
seg_tree[pos] = arr_value;
return seg_tree[pos];
}
int middle = left + ((right - left) >> 1);
seg_tree[pos] = max(
rec_update(LEFT(pos), left, middle, arr_pos, arr_value),
rec_update(RIGHT(pos), middle + 1, right, arr_pos, arr_value)
);
return seg_tree[pos];
}
void update(int pos, int new_val) {
--pos;
arr[pos] = new_val;
rec_update(0, 0, arr.size() - 1, pos, new_val);
}
int main(void) {
fin >> n >> m;
for (int i = 0; i < n; ++i) {
int a;
fin >> a;
arr.push_back(a);
}
// Create the segment tree
create_segment_tree();
for (int i = 0; i < m; ++i) {
int op;
fin >> op;
switch (op) {
case 0:
int left, right;
fin >> left >> right;
fout << query(left, right) << "\n";
break;
case 1:
int pos, val;
fin >> pos >> val;
update(pos, val);
break;
}
}
return 0;
}