#include <algorithm>
#include <cstdio>
#include <fstream>
#include <iostream>
using namespace std;
// ifstream f("arbint.in");
// ofstream g("arbint.out");
#define dim 8192
char ax[dim];
int pz;
void readInt(int &x) {
x = 0;
while (ax[pz] < '0' || ax[pz] > '9')
if (++pz == dim)
fread(ax, 1, dim, stdin), pz = 0;
while (ax[pz] >= '0' && ax[pz] <= '9') {
x = x * 10 + ax[pz] - '0';
if (++pz == dim)
fread(ax, 1, dim, stdin), pz = 0;
}
}
int H[400001], n, m, sol, t, x, y;
int a[100001];
void update(int n, int left, int right, int p, int v) {
if (left >= right) {
H[n] = v;
return;
}
int m = (left + right) / 2;
if (p <= m)
update(2 * n, left, m, p, v);
else
update(2 * n + 1, m + 1, right, p, v);
H[n] = max(H[2 * n], H[2 * n + 1]);
}
int query(int n, int left, int right, int ql, int qr) {
if (ql <= left && right <= qr) {
return H[n];
}
int m = (left + right) / 2;
int result = 0;
if (ql <= m)
result = max(result, query(2 * n, left, m, ql, qr));
if (qr > m)
result = max(result, query(2 * n + 1, m + 1, right, ql, qr));
return result;
}
void build(int n, int l, int r) {
if (l >= r) {
H[n] = a[l];
return;
}
int m = (l + r) / 2;
build(2 * n, l, m);
build(2 * n + 1, m + 1, r);
H[n] = max(H[2 * n], H[2 * n + 1]);
}
int main() {
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
// setvbuf(stdin, NULL, _IOFBF, 8192);
// scanf("%d %d\n", &n, &m);
// cin >> n >> m;
readInt(n);
readInt(m);
for (int i = 1; i <= n; ++i) {
// scanf("%d ", &a[i]);
readInt(a[i]);
// cin >> a[i];
/// update(1, 1, n, i, x);
}
build(1, 1, n);
for (int i = 1; i <= m; ++i) {
readInt(t);
readInt(x);
readInt(y);
// scanf("%d %d %d", &t, &x, &y);
// cin >> t >> x >> y;
if (t)
update(1, 1, n, x, y);
else {
cout << query(1, 1, n, x, y) << "\n";
}
}
return 0;
}