#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int maxN = 1e5 + 5;
int arb[4 * maxN], v[maxN];
void build (int k, int st, int dr) {
if(st == dr)
arb[k] = v[st];
else {
int mij = (st + dr) / 2;
build(k * 2, st, mij);
build(k * 2 + 1, mij + 1, dr);
arb[k] = max(arb[k*2], arb[k*2+1]);
}
}
void update(int poz, int val, int k, int st, int dr) {
if(st == dr) {
arb[k] = val;
} else {
int mij = (st + dr) / 2;
if(poz <= mij)
update(poz, val, k*2, st, mij);
else
update(poz, val, k*2+1, mij+1, dr);
arb[k] = max(arb[k*2], arb[k*2+1]);
}
}
int query (int l, int r, int k, int st, int dr) {
if(l > r) return 0;
if(l <= st && dr <= r) {
return arb[k];
}
int mij = (st + dr) / 2;
return max(query(l, min(mij, r), k*2, st, mij),
query(max(l, mij+1), r, k*2+1, mij+1, dr));
}
int main()
{
int n, m;
fin >> n >> m;
for(int i = 1; i <= n; ++i)
fin >> v[i];
build(1, 1, n);
for(int i = 1; i <= m; ++i) {
int op; fin >> op;
int a, b; fin >> a >> b;
if(op == 0) {
fout << query(a, b, 1, 1, n) << "\n";
} else {
update(a, b, 1, 1, n);
}
}
return 0;
}