#include <bits/stdc++.h>
using namespace std;
struct Nod {
int val;
Nod *left;
Nod *right;
Nod() {
val = 0;
left = right = NULL;
}
};
int v[100005];
void update(Nod* nod, int l, int r, int x, int y) {
if (l == r) {
nod->val = y;
return;
}
int mid = (l + r) / 2;
if (x <= mid)
update(nod->left, l, mid, x, y);
else
update(nod->right, mid + 1, r, x, y);
nod->val = max(nod->left->val, nod->right->val);
}
int querry(Nod* nod, int l, int r, int x, int y) {
if (x <= l && r <= y)
return nod->val;
int mid = (l + r) / 2;
int ans1 = -1, ans2 = -1;
if (x <= mid)
ans1 = querry(nod->left, l, mid, x, y);
if (mid < y)
ans2 = querry(nod->right, mid + 1, r, x, y);
return max(ans1, ans2);
}
void create(Nod *nod, int l, int r) {
if (l == r) {
nod->val = v[l];
return;
}
nod->left = new Nod();
nod->right = new Nod();
int mid = (l + r) >> 1;
create(nod->left, l, mid);
create(nod->right, mid + 1, r);
nod->val = max(nod->left->val, nod->right->val);
}
int n, m;
Nod* root;
int main() {
ios_base::sync_with_stdio(false);
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin >> n >> m;
root = new Nod();
for (int i = 1; i <= n; i++)
cin >> v[i];
create(root, 1, n);
for (int i = 1, op, x, y; i <= n; i++) {
cin >> op >> x >> y;
if (!op)
cout << querry(root, 1, n, x, y) << "\n";
else
update(root, 1, n, x, y);
}
return 0;
}