#include <bits/stdc++.h>
#define NMAX 100000
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int vaint[4 * NMAX + 1], v[NMAX + 1];
static inline int join(int A, int B) {
return max(A, B);
}
void build(int node, int left, int right) {
if (left == right) {
vaint[node] = v[left];
return;
}
int med = (left + right) / 2;
build(node * 2, left, med);
build(node * 2 + 1, med + 1, right);
vaint[node] = join(vaint[node * 2], vaint[node * 2 + 1]);
}
void update(int node, int left, int right, int poz, int val) {
if (left == right) {
vaint[node] = val;
return;
}
int med = (left + right) / 2;
if (poz <= med)
update(node * 2, left, med, poz, val);
else
update(node * 2 + 1, med + 1, right, poz, val);
vaint[node] = join(vaint[node * 2], vaint[node * 2 + 1]);
}
int query(int node, int left, int right, int qryleft, int qryright) {
if (left == qryleft && right == qryright)
return vaint[node];
int med = (left + right) / 2;
if (qryleft <= med && qryright > med)
return join(query(node * 2, left, med, qryleft, qryleft), query(node * 2 + 1, med + 1, right, med + 1, right));
else if (qryleft <= med)
return query(node * 2, left, med, qryleft, qryright);
else
return query(node * 2 + 1, med + 1, right, qryleft, qryright);
}
int main() {
int n, q, i, op, a, b;
fin >> n >> q;
for (i = 0; i < n; i++)
fin >> v[i];
build(1, 0, n - 1);
while (q--) {
fin >> op >> a >> b;
if (op == 0)
fout << query(1, 0, n - 1, a - 1, b - 1) << "\n";
else
update(1, 0, n - 1, a - 1, b);
}
return 0;
}