#include <fstream>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
int aint[4 * NMAX + 5];
int n, m, x, i, a, b, q, ans;
void update(int node, int st, int dr, int poz, int x) {
if(st == dr) {
aint[node] = x;
return;
}
int med = (st + dr) / 2;
if(poz <= med)
update(node * 2, st, med, poz, x);
else
update(node * 2 + 1, med + 1, dr, poz, x);
aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
}
void query(int node, int st, int dr) {
if(a <= st && dr <= b) {
ans = max(ans, aint[node]);
return;
}
if(st == dr)
return;
int med = (st + dr) / 2;
if(a <= med)
query(node * 2, st, med);
else if(b > med)
query(node * 2 + 1, med + 1, dr);
}
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin >> n >> m;
for(i = 1; i <= n; ++i) {
cin >> x;
update(1, 1, n, i, x);
}
for(i = 1; i <= m; ++i) {
cin >> q >> a >> b;
if(q == 0) {
ans = 0;
query(1, 1, n);
cout << ans << "\n";
} else {
update(1, 1, n, a, b);
}
}
return 0;
}