#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, op, a, b, p = 0;
int v[100000], arb[400000];
void build(int st, int dr, int act) {
if (st == dr) {
arb[act] = v[st];
return;
}
int mij = (st + dr) / 2;
build(st, mij, act * 2);
build(mij + 1, dr, act * 2 + 1);
arb[act] = max(arb[act * 2], arb[act * 2 + 1]);
}
void update(int st, int dr, int act, int poz) {
if (st == dr) {
arb[act] = v[poz];
return;
}
int mij = (st + dr) / 2;
if (mij >= poz) {
update(st, mij, act * 2, poz);
}
else {
update(mij + 1, dr, act * 2 + 1, poz);
}
arb[act] = max(arb[act * 2], arb[act * 2 + 1]);
}
void query(int st, int dr, int act, int start, int fin) {
if (st >= start && dr <= fin) {
p = max(p, arb[act]);
return;
}
int mij = (st + dr) / 2;
if (mij >= start) {
query(st, mij, act * 2, start, fin);
}
if (mij < fin) {
query(mij + 1, dr, act * 2 + 1, start, fin);
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> v[i];
}
build(1, n, 1);
for (int i = 1; i <= m; i++) {
fin >> op >> a >> b;
if (op == 0) {
p=0;
query(1, n, 1, a, b);
fout << p << '\n';
}
else {
v[a] = b;
update(1, n, 1, a);
}
}
}