#include <iostream>
#include <fstream>
using namespace std;
const int NMAX = 100000;
int arbint[NMAX * 4], v[NMAX + 3];
void build (int st, int dr, int nod) {
if (st == dr) {
arbint[nod] = v[st];
return ;
}
int mid = (st + dr) / 2;
build (st, mid, 2 * nod);
build (mid + 1, dr, 2 * nod + 1);
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
// cout << st << " " << dr << " " << nod << "\n";
}
void update(int poz, int val, int st, int dr, int nod) {
if (st == dr) {
arbint[nod] = val;
return;
}
int mid = (st + dr) / 2;
if (poz <= mid) {
update(poz, val, st, mid, 2 * nod);
}
else {
update(poz, val, mid + 1, dr, 2 * nod + 1);
}
arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);
}
int query(int a, int b, int st, int dr, int nod) {
if (a <= st && dr <= b) {
return arbint[nod];
}
int mid = (st + dr) / 2, ans = 0;
if (a <= mid) {
ans = max(ans, query(a, b, st, mid, 2 * nod));
}
if (b >= mid + 1) {
ans = max(ans, query(a, b, mid + 1, dr, 2 * nod + 1));
}
return ans;
}
int main() {
int n, m;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
int put = 1;
/*while (put < n) {
put *= 2;
}*/
build(1, n, 1);
int op, a, b;
for (int i = 1; i <= m; i++) {
cin >> op >> a >> b;
if (op == 0) {
cout << query(a, b, 1, n, 1) << "\n";
} else {
update(a, b, 1, n, 1);
}
}
return 0;
}