#include <bits/stdc++.h>
using namespace std;
#define in fin
#define out fout
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 1e5;
int task, n, x, nrQ, a, b;
int aint[4*MAXN + 1];
int max(int a, int b) { return (a > b ? a : b); }
void update(int a, int b, int nod, int poz, int val) {
if (a == b)
aint[nod] = val;
else {
int mid = (a + b) / 2;
if (poz <= mid)
update(a, mid, 2 * nod, poz, val);
else
update(mid + 1, b, 2 * nod + 1, poz, val);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
}
int query(int a, int b, int nod, int st, int dr) {
int maxSt = 0, maxDr = 0;
if (st <= a && b <= dr)
return aint[nod];
int mid = (a + b) / 2;
if (st <= mid)
maxSt = query(a, mid, nod * 2, st, dr);
if (mid < dr)
maxDr = query(mid + 1, b, nod * 2 + 1, st, dr);
return max(maxSt, maxDr);
}
int main() {
in >> n >> nrQ;
for (int i = 1; i <= n; i++) {
in >> x;
update(1, n, 1, i, x);
}
for (int i = 1; i <= nrQ; i++) {
in >> task >> a >> b;
if (task == 0)
out << query(1, n, 1, a, b) << '\n';
else
update(1, n, 1, a, b);
}
return 0;
}