#include <iostream>
#include <fstream>
#define DIM 100001
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m;
int ST[4 * DIM + 66];
int maxim;
void update (int node, int pos, int val, int st, int dr) {
if (st == dr) ST[node] = val;
else {
int mid = (st + dr) / 2;
if (pos <= mid) update(2 * node, pos, val, st, mid);
else update(2 * node + 1, pos, val, mid + 1, dr);
ST[node] = max(ST[2 * node], ST[2 * node + 1]);
}
}
void query (int node, int left, int right, int x, int y) {
if (left >= x && right <= y) {
if (maxim < ST[node]) maxim = ST[node];
}
else {
int mid = (left + right) / 2;
if (mid >= x)
query(2 * node, left, mid, x, y);
if (mid < y)
query(2 * node + 1, mid + 1, right, x, y);
}
}
int main() {
int i;
int x, a, b;
fin >> n >> m;
for (i = 1; i <= n; ++i) {
fin >> x;
update(1, i, x, 1, n);
}
for (i = 1; i <= m; ++i) {
fin >> x >> a >> b;
if (x == 0) {
maxim = -1;
query(1, 1, n, a, b);
fout << maxim << '\n';
}
else {
update(1, a, b, 1, n);
}
}
return 0;
}