#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
const int nmax = 1e5;
int n, m, aint[nmax * 2];
void act(int nod, int loc_left, int loc_right, int left, int right, int val) {
if (left <= loc_left && loc_right <= right)
aint[nod] = val;
else {
int mid = (loc_left + loc_right) / 2;
if (left <= mid)
act(nod * 2, loc_left, mid, left, right, val);
if (right > mid)
act(nod * 2 + 1, mid + 1, loc_right, left, right, val);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
}
int querry(int nod, int loc_left, int loc_right, int left, int right) {
if (left <= loc_left && loc_right <= right)
return aint[nod];
else {
int q = 0, mid = (loc_left + loc_right) / 2;
if (left <= mid)
q = max(querry(nod * 2, loc_left, mid, left, right), q);
if (right > mid)
q = max(querry(nod * 2 + 1, mid + 1, loc_right, left, right), q);
return q;
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
act(1, 1, n, i, i, x);
}
for (int i = 1; i <= m; i++) {
int q, a, b;
cin >> q >> a >> b;
if (q == 0) {
cout << querry(1, 1, n, a, b) << "\n";
}
else {
act(1, 1, n, a, a, b);
}
}
}