#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 100001;
int tree[4 * MAXN], n, t;
void update(int pos, int value, int ind, int left, int right) {
if (left == right) {
tree[ind] = value;
return;
}
int middle = left + (right - left) / 2;
if (pos <= middle)
update(pos, value, 2 * ind, left, middle);
else
update(pos, value, 2 * ind + 1, middle + 1, right);
tree[ind] = max(tree[2 * ind], tree[2 * ind + 1]);
}
int getMax(int x, int y, int ind, int left, int right) {
if (left >= x && right <= y)
return tree[ind];
int middle = left + (right - left) / 2;
if (y <= middle)
return getMax(x, y, 2 * ind, left, middle);
if (x > middle)
return getMax(x, y, 2 * ind + 1, middle + 1, right);
return max(getMax(x, y, 2 * ind, left, middle), getMax(x, y, 2 * ind + 1, middle + 1, right));
}
int main() {
fin >> n >> t;
for (int i = 1; i <= n; ++i) {
int x;
fin >> x;
update(i, x, 1, 1, n);
}
for (int i = 1; i <= t; ++i) {
int type, x, y;
fin >> type >> x >> y;
if (type == 0)
fout << getMax(x, y, 1, 1, n) << '\n';
else
update(x, y, 1, 1, n);
}
return 0;
}