#include <bits/stdc++.h>
using namespace std;
#ifndef LOCAL
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout
#endif
int n, m;
vector<int> v, aint;
void build(int nod, int l, int r) {
int mid = (l + r) >> 1;
if(l != r) {
build(2 * nod, l, mid);
build(2 * nod + 1, mid + 1, r);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
} else
aint[nod] = v[l];
}
void update(int nod, int l, int r, int a, int b) {
v[a] = b;
int mid = (l + r) >> 1;
if(l == r && l == a) {
aint[nod] = b;
} else {
if(a <= mid) {
update(2 * nod, l, mid, a, b);
} else {
update(2 * nod + 1, mid + 1, r, a, b);
}
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
int query(int nod, int l, int r, int x, int y) {
if(l == x && r == y)
return aint[nod];
int mid = (l + r) >> 1;
if(y <= mid)
return query(2 * nod, l, mid, x, y);
if(x > mid)
return query(2 * nod + 1, mid + 1, r, x, y);
return max(query(2 * nod, l, mid, x, mid), query(2 * nod + 1, mid + 1, r, mid + 1, y));
}
signed main() {
cin >> n >> m;
v.resize(n+1);
aint.resize(4*(n+1));
for(int i = 1; i <= n; ++i) {
cin >> v[i];
}
build(1, 1, n);
while(m--) {
int nr, a, b; cin >> nr >> a >> b;
if(nr == 0)
cout << query(1, 1, n, a, b) << '\n';
else
update(1, 1, n, a, b);
}
return 0;
}