#include <bits/stdc++.h>
using namespace std;
typedef long long i8;
class AINT {
private:
vector<int> v;
int n;
void build(int n, int st, int dr, const vector<int>& arr) {
if (st == dr) {
v[n] = arr[st];
} else {
int mid = (st + dr) / 2;
build(n * 2, st, mid, arr);
build(n * 2 + 1, mid + 1, dr, arr);
v[n] = max(v[n * 2], v[n * 2 + 1]);
}
}
public:
void strt(int node, const vector<int>& arr) {
n = node;
v.assign(4 * node, 0);
build(1, 0, n - 1, arr);
};
void update(int n, int st, int dr, int a, int b) {
if (st == dr) {
v[n] = b;
return;
}
int mid = (st + dr) / 2;
if (a <= mid)
update(n * 2, st, mid, a, b);
else
update(n * 2 + 1, mid + 1, dr, a, b);
v[n] = max(v[n * 2], v[n * 2 + 1]);
}
int query(int n, int st, int dr, int a, int b) {
if (b < st || dr < a) return INT_MIN;
if (a <= st && dr <= b) return v[n];
int mid = (st + dr) / 2;
int q1 = query(n * 2, st, mid, a, b);
int q2 = query(n * 2 + 1, mid + 1, dr, a, b);
return max(q1, q2);
}
};
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n, m;
cin >> n >> m;
vector<int> arr(n);
for (auto& e : arr) cin >> e;
AINT seg;
seg.strt(n, arr);
for (int i = 0; i < m; i++) {
int c, a, b;
cin >> c >> a >> b;
if (c == 1) {
a--;
seg.update(1, 0, n - 1, a, b);
} else {
a--;
b--;
cout << seg.query(1, 0, n - 1, a, b) << "\n";
}
}
return 0;
}