#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 100041;
int n, m, arb[4*MAXN];
int a[MAXN];
void citire() {
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> a[i];
}
void build(int st, int dr, int nod=1) {
if (st == dr) {
arb[nod] = a[st];
return;
}
int mid = (st+dr) >> 1;
build(st, mid, nod<<1);
build(mid+1, dr, nod<<1 | 1);
arb[nod] = max(arb[nod<<1], arb[nod<<1 | 1]);
}
int query(int qst, int qdr, int st=1, int dr=n, int nod= 1) {
if (qst <= st && dr <= qdr)
return arb[nod];
int mid = (st+dr) >> 1;
int val = INT32_MIN;
if (mid >= qst)
val = max(val, query(qst, qdr, st, mid, nod<<1));
if (qdr > mid)
val = max(val, query(qst, qdr, mid+1, dr, nod<<1 | 1));
return val;
}
void update(int pos, int val, int st = 1, int dr = n, int nod = 1) {
if (st == dr)
arb[nod] = val;
else {
int mid = (st+dr) >> 1;
if (pos <= mid)
update(pos, val, st, mid, nod<<1);
else
update(pos, val, mid+1, dr, nod<<1 | 1);
arb[nod] = max(arb[nod<<1], arb[nod<<1|1]);
}
}
int main() {
citire();
build(1, n);
for (int i = 1; i <= m; i++) {
int op, a, b;
fin >> op >> a >> b;
if (op == 0) {
fout << query(a, b) << endl;
}
else {
update(a, b);
}
}
return 0;
}