#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 100000;
int segTree[5 + 4 * MAX_N];
void update(int pos, int val, int node, int lft, int rght) {
if (lft == rght)
segTree[node] = val;
else {
int mid;
mid = (lft + rght) >> 1;
if (pos <= mid)
update(pos, val, 2 * node, lft, mid);
else
update(pos, val, 2 * node + 1, mid + 1, rght);
segTree[node] = max(segTree[2 * node], segTree[2 * node + 1]);
}
}
int query(int qLeft, int qRight, int node, int lft, int rght) {
if (qLeft <= lft && rght <= qRight)
return segTree[node];
int mid, q1, q2;
mid = (lft + rght) >> 1;
q1 = q2 = 0;
if (qLeft <= mid)
q1 = query(qLeft, qRight, 2 * node, lft, mid);
if (qRight > mid)
q2 = query(qLeft, qRight, 2 * node + 1, mid + 1, rght);
return max(q1, q2);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
update(i, x, 1, 1, n);
}
for (int i = 1; i <= m; i++) {
int type, a, b;
scanf("%d%d%d", &type, &a, &b);
if (type == 0)
printf("%d\n", query(a, b, 1, 1, n));
else
update(a, b, 1, 1, n);
}
return 0;
}