#include <iostream>
#include <fstream>
using namespace std;
int Arb[260010];
int n, m, i, x, y, op;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void Update(int nod, int st, int dr, int a, int b, int val) {
if (dr < a || st > b)
return;
int mij;
if (st >= a && dr <= b) {
Arb[nod] = val;
} else {
mij = (st + dr) / 2;
Update(nod * 2, st, mij, a, b, val);
Update(nod * 2 + 1, mij + 1, dr, a, b, val);
Arb[nod] = max(Arb[nod * 2], Arb[nod * 2 + 1]);
}
}
int Query(int nod, int st, int dr, int a, int b) {
if (dr < a || st > b)
return 0;
int mij;
if (st >= a && dr <= b) {
return Arb[nod];
} else {
mij = (st + dr) / 2;
return max(Query(nod * 2, st, mij, a, b), Query(nod * 2 + 1, mij + 1, dr, a, b));
}
}
int main()
{
fin >> n;
fin >> m;
for (i = 1 ; i <= n ; i++) {
fin >> x;
Update(1, 1, n, i, i, x);
}
for (i = 1 ; i <= m ; i++) {
fin >> op;
if (op == 1) {
fin >> x >> y;
Update(1, 1, n, x, x, y);
} else {
fin >> x >> y;
fout << Query(1, 1, n, x, y) << '\n';
/// find max
}
}
return 0;
}