#include <fstream>
#include <algorithm>
#define NMAX 100005
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int arr[NMAX];
int tree[4*NMAX];
void build(int st, int dr, int x) {
if (st == dr) {
tree[x] = arr[st];
return;
}
int mij = (st + dr) / 2;
build(st, mij, 2 * x);
build(mij+1, dr, 2 * x +1);
tree[x] = max(tree[2*x], tree[2*x+1]);
}
void update(int st, int dr, int x, int poz, int e) {
if (st == dr) {
tree[x] = e;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
update(st, mij, 2*x, poz, e);
else update(mij+1, dr, 2*x+1, poz, e);
tree[x] = max(tree[2*x], tree[2*x+1]);
}
int maxim(int st, int dr, int x, int a, int b) {
if (st >= a && dr <= b)
return tree[x];
if (dr < a || st > b)
return -1;
int mij = (st + dr) / 2;
return max(maxim(st, mij, 2*x, a, b), maxim(mij+1, dr, 2*x+1, a, b));
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; ++i)
in >> arr[i];
build(1, n, 1);
//out << tree[1];
while (m) {
int p;
in >> p;
if (p == 0) {
int a, b;
in >> a >> b;
out << maxim(1, n, 1, a, b) << '\n';
}
else {
int poz, e;
in >> poz >> e;
update(1, n, 1, poz, e);/*
for (int i = 0; i < 4*n; ++i)
out << tree[i] << ' ';
out << '\n';*/
}
m--;
}/*
for (int i = 0; i < 4*n; ++i)
out << tree[i] << ' ';*/
return 0;
}