// Mihai Priboi
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX_N 100000
int v[MAX_N], aint[MAX_N * 2];
void init(int l, int r, int u) {
int mid = (r + l) / 2;
int lc = u + 1;
int rc = u + 2 * (mid - l + 1);
if (l == r) {
aint[u] = v[l - 1];
} else {
init(l, mid, lc);
init(mid + 1, r, rc);
aint[u] = max(aint[lc], aint[rc]);
}
}
int query(int a, int b, int l, int r, int u) {
int mid = (r + l) / 2;
int lc = u + 1;
int rc = u + 2 * (mid - l + 1);
if (a == l && b == r)
return aint[u];
int mx = 0;
if (a <= mid) mx = max(mx, query(a, min(b, mid), l, mid, lc));
if (b > mid) mx = max(mx, query(max(a, mid + 1), b, mid + 1, r, rc) );
return mx;
}
void update(int pos, int val, int l, int r, int u) {
int mid = (r + l) / 2;
int lc = u + 1;
int rc = u + 2 * (mid - l + 1);
if (l == r) {
aint[u] = val;
} else {
if (pos <= mid) update(pos, val, l, mid, lc);
if (pos > mid) update(pos, val, mid + 1, r, rc);
aint[u] = max(aint[lc], aint[rc]);
}
}
int main() {
FILE *fin, *fout;
int n, q;
fin = fopen("arbint.in", "r");
fout = fopen("arbint.out", "w");
fscanf(fin, "%d%d", &n, &q);
for (int i = 0; i < n; i++)
fscanf(fin , "%d", &v[i]);
init(1, n, 0);
while (q--) {
int c, a, b;
fscanf(fin, "%d%d%d", &c, &a, &b);
if (c == 0) {
fprintf(fout, "%d\n", query(a, b, 1, n, 0));
} else {
update(a, b, 1, n, 0);
}
}
fclose(fin);
fclose(fout);
return 0;
}