#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100001
using namespace std;
int AINT[2 * NMAX];
void update(int node, int left, int right, int pos, int val) {
if (left == right)
AINT[node] = val;
else {
int mid = left + (right - left) / 2;
if (pos <= mid)
update(2 * node, left, mid, pos, val);
if (pos > mid)
update(2 * node + 1, mid + 1, right, pos, val);
AINT[node] = max(AINT[2 * node], AINT[2 * node + 1]);
}
}
int query(int node, int left, int right, int x, int y) {
if (x <= left && right <= y)
return AINT[node];
else {
int mid = left + (right - left) / 2;
int val1 = -1, val2 = -1;
if (x <= mid)
val1 = query(2 * node, left, mid, x, y);
if (mid < y)
val2 = query(2 * node + 1, mid + 1, right, x, y);
return max(val1, val2);
}
}
int main() {
int n, m, x, code, y;
ifstream in("arbint.in");
ofstream out("arbint.out");
in >> n >> m;
for (int i = 1; i <= n; ++i) {
in >> x;
update(1, 1, n, i, x);
}
for (int i = 1; i <= m; ++i) {
in >> code >> x >> y;
if (code == 0)
out << query(1, 1, n, x, y) << "\n";
else if (code == 1)
update(1, 1, n, x, y);
}
in.close();
out.close();
return 0;
}