#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
void update(int node, int left, int right, int ind, int val, std::vector<int> &arr) {
if (left == right) {
arr[node] = val;
return;
}
int m = left + (right - left) / 2;
int l = node * 2;
int r = l + 1;
if (ind <= m) {
update(l, left, m, ind, val, arr);
} else {
update(r, m + 1, right, ind, val, arr);
}
arr[node] = std::max(arr[l], arr[r]);
}
int query(int node, int left, int right, int a, int b, std::vector<int> &arr) {
if (a <= left && right <= b) {
return arr[node];
}
int m = left + (right - left) / 2, res1 = -1, res2 = -1;
int l = node * 2;
int r = l + 1;
if (a <= m) {
res1 = query(l, left, m, a, b, arr);
}
if (m < b) {
res2 = query(r, m + 1, right, a, b, arr);
}
return std::max(res1, res2);
}
int main() {
std::ifstream in("arbint.in");
std::ofstream out("arbint.out");
int nV, oP, o, b, d;
in >> nV >> oP;
std::vector<int> arr(nV + 1, -1);
for (int i(1); i <= nV; i++) {
in >> b;
update(1, 1, nV, i, b, arr);
}
for(int i = 0; i < oP; i++) {
in >> o >> b >> d;
if(o == 0) {
out << query(1, 1, nV, b, d, arr) << '\n';
} else {
update(1, 1, nV, b, d, arr);
}
}
in.close();
out.close();
return 0;
}