#include <iostream>
#include <fstream>
#define Nmax 300001
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int v[Nmax];
int max(int a, int b) {
if(a > b)
return a;
else
return b;
}
void update(int nod, int st, int dr, int pos, int val) {
if (st == dr) {
v[nod] = val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid) {
update(nod * 2, st, mid, pos, val);
} else{
update(nod * 2 + 1, mid + 1, dr, pos, val);
}
v[nod] = max(v[nod * 2], v[nod * 2 + 1]);
}
int query(int nod, int lo, int hi, int start, int finish) {
if (start > hi || lo > finish) {
return -1;
}
if (start <= lo && hi <= finish) {
return v[nod];
}
int mid = (lo + hi) / 2;
return max(
query(nod * 2, lo, mid, start, finish),
query(nod * 2 + 1, mid + 1, hi, start, finish)
);
}
int main()
{
int n, m, x, a, b, i, t, maxim;
in >> n >> m;
for(i = 1; i <= n; i++) {
in >> x;
update(1, 1, n, i, x);
}
for(i = 1; i <= m; i++) {
in >> t >> a >> b;
if(t == 0) {
maxim = query(1, 1, n, a, b);
out << maxim << '\n';
}
else {
update(1, 1, n, a, b);
}
}
in.close();
out.close();
return 0;
}