#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct Aint {
Aint(int n) {
arb.resize(n << 2);
init(1, n, 1);
}
vector < int > arb;
void init(int st, int dr, int node) {
if (st == dr) {
fin >> arb[node];
return;
}
int mid = (st + dr) >> 1;
int left = node * 2, right = left + 1;
init(st, mid, left);
init(mid + 1, dr, right);
arb[node] = max(arb[left], arb[right]);
}
void update(int poz, int val, int st, int dr, int node) {
if (st == dr) {
arb[node] = val;
return;
}
int mid = (st + dr) >> 1;
int left = node * 2, right = left + 1;
if (poz <= mid) {
update(poz, val, st, mid, left);
}
else {
update(poz, val, mid + 1, dr, right);
}
arb[node] = max(arb[left], arb[right]);
}
int query(int qSt, int qDr, int st, int dr, int node) {
if (qSt <= st and dr <= qDr) {
return arb[node];
}
int mid = (st + dr) >> 1;
int left = node * 2, right = left + 1;
int rezSt = -1, rezDr = -1;
if (qSt <= mid) {
rezSt = query(qSt, qDr, st, mid, left);
}
if (mid + 1 <= qDr) {
rezDr = query(qSt, qDr, mid + 1, dr, right);
}
return max(rezSt, rezDr);
}
};
int main() {
int n, m;
fin >> n >> m;
Aint aint(n);
while (m --) {
int t, a, b;
fin >> t >> a >> b;
if (t == 0) {
fout << aint.query(a, b, 1, n, 1) << '\n';
}
else {
aint.update(a, b, 1, n, 1);
}
}
}