#include <iostream>
#include <fstream>
using namespace std;
#define INF 999999999;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, a[200005];
void update(int nod, int l, int r, int p, int v) {
if (l == r)
{
a[nod] = v;
return;
}
int m = (l + r) / 2;
int ls = nod * 2, rs = ls + 1;
if (p <= m)
update(ls, l, m, p, v);
else
update(rs, m + 1, r, p, v);
a[nod] = max(a[ls], a[rs]);
}
int query(int nod, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) {
return a[nod];
}
int m = (l + r) / 2;
int ls = nod * 2, rs = ls + 1;
int ans = -INF;
if (ql <= m)
ans = max(ans, query(ls, l, m, ql, qr));
if (qr > m)
ans = max(ans, query(rs, m+1, r, ql, qr));
return ans;
}
void read() {
in >> n >> m;
int v;
for (int i = 1; i <= n; ++i) {
in >> v;
update(1, 1, n, i, v);
}
}
int main() {
read();
bool tip;
int a, b;
for (int i = 0; i < m; ++i) {
in >> tip >> a >> b;
if (tip) {
update(1, 1, n, a, b);
}
else
out << query(1, 1, n, a, b) << "\n";
}
return 0;
}